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

2022-09-01 02:26:18

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

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

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

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


答案 1

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

  1. 创建充气机:

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

大功告成,尽情享受吧!


答案 2

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

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

然后,我将定义一个抽象方法,该方法返回每个子类的标题栏下方的内容布局;的基数然后只需调用getContentAreaLayoutId()CustomTitlebarActivityIDonCreate()CustomTitlebarActivity

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

或者,您可以让用于获取内容区域的抽象方法返回 a 而不是 an,从而更灵活地动态构造视图(但强制您在简单的只是转储此 XML 布局的情况下自己扩展它们)。Viewint


推荐