Question

Ma classe abstraite étendue de la classe Activity se compose de trois Views comme décrit dans l'extrait de code XML suivant:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="@drawable/bg">

    <LinearLayout 
        android:id="@+id/top_border">
        ...
    </LinearLayout>

    <View 
        android:id="@+id/activity_content"
        ...
        />

    <LinearLayout 
        android:id="@+id/bottom_border">
        ...          
    </LinearLayout>
</LinearLayout>

Et dans la méthode onCreate(), j'ai défini cette mise en page XML comme vue de contenu.

Je veux que les Activitys qui étendent celui-ci écrasent onCreate() et définissent là les bordures restantes de activity_content View immuables.

Par exemple comme ceci:

abstract public class MyActivity extends Activity {
   protected View mContent;

   @Override
   protected onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.common_layout);
      initializeContent();
   }

   abstract void initializeContent();  
}

class OneActivity extends MyActivity {

   @Override
   protected void initializeContent() {
      mContent = View.inflate(this, R.layout.some_view, null); // i.e. concrete View (e.g. LinearLayout, FrameLayout, GridView, etc.)
   }
}

Mais quand je le fais, mon mContent reste le même que lorsque je l'ai défini dans le MyActivity de onCreate().

Était-ce utile?

La solution

Commencez par changer la vue de votre mise en page principale en un groupe de vues (par exemple, un LinearLayout).Ensuite, vous pouvez y ajouter des vues .Si vous ajoutez une vue unique, elle aura exactement l'effet que vous souhaitez obtenir.

class OneActivity extends MyActivity {
   @Override
   protected void initializeContent() {
      final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.activity_content);
      viewGroup.addView(View.inflate(this, R.layout.some_view, null)); 
   }
}

Dans votre cas, cela devrait fonctionner.Si votre groupe de vues personnalisées contenait d'autres vues de plus haut dans la hiérarchie, vous pouvez le nettoyer avant d'ajouter votre vue personnalisée:

viewGroup.removeAllViews();

Cela fonctionne, c'est exactement ce que je fais dans la plupart de mes projets.

Une alternative consiste à consulter l ' API Fragments , disponible pour les dernières versions du SDK..

Autres conseils

Vous ne pouvez pas remplacer les membres de données de classe en Java, utilisez plutôt des méthodes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top