Android编程:以编程方式包含布局(即无需XML)

41

我创建了一个名为CustomTitlebarActivity的Activity子类。基本上,我的应用程序中每个主要的activity都将拥有一个自定义标题栏,其中包括许多常见功能,如Home按钮、标题、搜索按钮等。在我的当前实现中,我仍然需要在每个CustomTitlebarActivity的布局XML中显式地使用include语句:

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

我觉得在CustomTitlebarActivity中应该可以做到这一点。我的两个问题是:什么样的代码可以替换这个include标记,以及代码应该放在哪里?(我的第一反应是将其放入CustomTitlebarActivity的setContentView方法中。)

另外,我想了解更好的重用Android UI代码的方法(即使在不同的活动中标题栏需要略有不同)。

2个回答

67

我也遇到了这个问题,现在我刚刚解决了它。我认为我的解决方案更简单:

  1. 创建一个 inflater:

  2. LayoutInflater inflater = (LayoutInflater)      this.getSystemService(LAYOUT_INFLATER_SERVICE);
    
  3. 扩展子布局:

  4. View childLayout = inflater.inflate(R.layout.child,
                (ViewGroup) findViewById(R.id.child_id));
    
  5. 将其添加到父元素中:

    parentLayout.addView(childLayout);
    

搞定了,享受它吧!


1
精确答案为<include layout="@layout/titlebar" />。 - App Work
8
ТѕЉУ«цСИ║т║ћУ»ЦТў»findViewById(R.id.child_id));УђїСИЇТў»R.layout.child_idсђѓ - Ranjit
当我这样做时,宽度似乎不能保持在布局中定义的状态。不知道为什么。 - Martin Kosicky
R.id.child_id是什么? - Donald Duck

19

就我个人而言,我可能会编写我的Activity子类,始终将setContentView设置为包含垂直的填充父级LinearLayout的布局文件,该布局文件仅包含我的标题栏:

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

那么我会在CustomTitlebarActivity中定义一个抽象的getContentAreaLayoutId()方法,该方法返回每个子类标题栏下方内容的布局ID;基础的CustomTitlebarActivityonCreate()方法就只需调用这个抽象方法。

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

或者,您可以使获取内容区域的抽象方法返回一个 View 而不是一个 int,这样可以为您提供更多构建动态视图的灵活性(但在简单的“只需将此 XML 布局转储到此处”情况下,强制使用自己的布局填充)。


这个配置起到了作用,我会进一步尝试。关于如何允许在这种标题栏上放置不同排列的操作按钮,有什么好的想法吗? - Jon Willis
这要看情况,但如果有一定数量的可预测的自定义(一个或两个自定义按钮/操作),我可能会坚持使用“由子类覆盖的抽象方法来获取要使用的图像和要执行的操作”的方式(例如抽象getFirstActionImageResourceId(),onFirstActionClicked()),并在基类的onCreate()中挂钩。 - Yoni Samlan

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