【问题标题】:Android programmatically include layout (i.e. without XML)Android 以编程方式包含布局(即没有 XML)
【发布时间】:2011-03-12 20:38:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java android include


    【解决方案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);
      

    完成了,尽情享受吧!

    【讨论】:

    • 的准确答案
    • 我认为应该是findViewById(R.id.child_id)); 而不是R.layout.child_id
    • 当我这样做时,宽度似乎并没有按照布局中的定义保持不变。不知道为什么
    【解决方案2】:

    就我个人而言,我可能会将我的 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>
    

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

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

    或者,您可以让获取内容区域的抽象方法返回 View 而不是 int,从而让您更灵活地动态构建视图(但迫使您自己在简单的 只需在此处转储此 XML 布局案例)。

    【讨论】:

    • 这个配置成功了,我会用它做更多的实验。关于如何在这种标题栏上允许不同排列的操作按钮有什么好的想法吗?
    • 这取决于,但如果有数量有限的相当可预测的自定义(一或两个自定义按钮/操作),我可能会坚持使用“被子类覆盖的抽象方法来获取图像使用和采取行动”的东西(比如抽象的 getFirstActionImageResourceId()、onFirstActionClicked()),然后将它们挂接到基类的 onCreate() 中。
    猜你喜欢
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2018-07-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多