动态更改活动中的视图内容

6

我的抽象类继承自Activity类,包含以下XML代码片段中描述的三个View

<?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布局设置为内容视图。

我希望扩展此类的Activity覆盖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保持不变,就像我在MyActivityonCreate()中定义它时一样。

如何根据前台的Activity更改视图的类型/内容?


嗨,如果我理解得正确,您想要一个带有一些固定布局和一些动态内容的模板。如果是这样,我鼓励您使用Fragments。 - Carlos Verdes
2个回答

8

首先,在您的主布局中将视图更改为视图组(例如,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();

它有效,我在大多数项目中都这样做。

另一种选择是查看片段API,适用于最新版本的SDK。


使用ViewGroup的另一个好处是,您可以在一个地方修改其布局(背景、宽度/高度等),所有子类活动都会受到影响。 - Guillaume

0

在Java中,您无法覆盖类数据成员,请改用方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接