Динамическое изменение содержимого просмотра в действии

Мой абстрактный класс, расширенный из класса Activity, состоит из трех View, как описано в следующем фрагменте XML:

<?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>

И в методе onCreate() я устанавливаю этот XML-макет как вид контента.

Я хочу, чтобы Activitys, которые расширяют этот, переопределяли onCreate() и определяли оставшиеся границы Activity_content View неизменными.

Например вот так:

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.)
   }
}

Но когда я это делаю, мой mContent остается таким же, каким он был, когда я определил его в onCreate() MyActivity.

Как я могу изменить тип/контент представления в зависимости от того, что Activity находится на переднем плане?


person teoREtik    schedule 16.01.2012    source источник
comment
Привет. Если я правильно вас понял, вы хотите иметь шаблон с фиксированным макетом и некоторой динамикой. Если это так, я рекомендую вам использовать фрагменты.   -  person Carlos Verdes    schedule 07.11.2013


Ответы (2)


Сначала измените представление в основном макете на группу представлений (например, LinearLayout). Затем вы можете добавить к нему просмотры. Если вы добавите уникальный вид, он будет иметь именно тот эффект, которого вы хотите достичь.

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)); 
   }
}

В вашем случае это должно сработать. Если ваша пользовательская группа представлений содержала другие представления, расположенные выше в иерархии, вы можете очистить ее перед добавлением своего пользовательского представления:

viewGroup.removeAllViews();

Это работает, я делаю именно так в большинстве своих проектов.

Альтернативой является использование Fragments API, доступного для последних версий SDK.

person Guillaume    schedule 16.01.2012
comment
Еще одним преимуществом использования ViewGroup является то, что вы можете изменить его макет (фон, ширину/высоту и т. д.) только в одном месте, и это повлияет на все действия вашего подкласса. - person Guillaume; 16.01.2012

Вы не можете переопределить члены данных класса в Java, вместо этого используйте методы

person Mahdi Hijazi    schedule 16.01.2012