所以我创建了一个名为CustomTitlebarActivity的Activity子类。基本上,我的应用程序中的每个主要活动都将有一个自定义标题栏,其中包含许多常用功能,如主页按钮,标题,搜索按钮等。在我当前的实现中,我仍然在布局XML中明确使用include语句每个CustomTitlebarActivity:
<include layout="@layout/titlebar" />
我应该能够在CustomTitlebarActivity中执行此操作。我有两个问题:什么代码可以替换此包含标记,我应该在哪里放置代码? (我的第一直觉是将它放在CustomTitlebarActivity的setContentView方法中。)
在相关的说明中,我希望能够深入了解重用Android UI代码的更好方法(即使本身标题栏需要在活动之间略有不同。)
答案 0 :(得分:57)
我也遇到了这个问题,我现在就解决了。我认为我的解决方案更容易:
创建一个inflater:
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
给孩子布局充气:
View childLayout = inflater.inflate(R.layout.child,
(ViewGroup) findViewById(R.id.child_id));
将其添加到父级:
parentLayout.addView(childLayout);
已经完成,享受它!
答案 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布局情况。)