Android以编程方式包含布局(即没有XML)

时间:2010-07-07 14:24:06

标签: java android include

所以我创建了一个名为CustomTitlebarActivity的Activity子类。基本上,我的应用程序中的每个主要活动都将有一个自定义标题栏,其中包含许多常用功能,如主页按钮,标题,搜索按钮等。在我当前的实现中,我仍然在布局XML中明确使用include语句每个CustomTitlebarActivity:

<include layout="@layout/titlebar" />

我应该能够在CustomTitlebarActivity中执行此操作。我有两个问题:什么代码可以替换此包含标记,我应该在哪里放置代码? (我的第一直觉是将它放在CustomTitlebarActivity的setContentView方法中。)

在相关的说明中,我希望能够深入了解重用Android UI代码的更好方法(即使本身标题栏需要在活动之间略有不同。)

2 个答案:

答案 0 :(得分:57)

我也遇到了这个问题,我现在就解决了。我认为我的解决方案更容易:

  1. 创建一个inflater:

    LayoutInflater inflater = (LayoutInflater)      this.getSystemService(LAYOUT_INFLATER_SERVICE);
    
  2. 给孩子布局充气:

    View childLayout = inflater.inflate(R.layout.child,
                (ViewGroup) findViewById(R.id.child_id));
    
  3. 将其添加到父级:

    parentLayout.addView(childLayout);
    
  4. 已经完成,享受它!

答案 1 :(得分:17)

就我个人而言,我可能会将Activity子类始终setContentView写入包含仅包含标题栏的垂直fill_parent LinearLayout的布局文件中: -

<LinearLayout android:id="@+id/custom_titlebar_container"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
   <!--titlebar here-->
</LinearLayout>

然后我在getContentAreaLayoutId()中定义一个抽象的CustomTitlebarActivity方法,它返回每个子类标题栏下面内容的布局ID; onCreate()的基础CustomTitlebarActivity将调用

setContentView(R.layout.custom_titlebar_activity_frame_from_above);
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container));

或者,您可以使用抽象方法获取内容区域View而不是int,从而为您提供动态构建视图的更大灵活性(但强制您自己对其进行充气)简单的只是在这里转储这个XML布局情况。)