包含使用merge标记和ViewStub的视图

时间:2015-03-30 11:17:03

标签: android

我想通过TableLayout元素扩展我的ViewStab一些额外的行。这是我Activity的布局:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root_table_layout">

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Row 1"/>
    </TableRow>

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Row 2"/>
    </TableRow>

    <ViewStub
        android:id="@+id/view_stub_1"
        android:layout="@layout/merge_table_1"/>

    <ViewStub
        android:id="@+id/view_stub_2"
        android:layout="@layout/merge_table_2"/>

</TableLayout>

view_stub_1view_stub_2Activity onCreate上夸大了(这取决于应用程序的状况)。

ViewStub应该将使用<merge>标记定义的布局作为根元素进行膨胀。像这样:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Row 5"/>
    </TableRow>

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Row 6"/>
    </TableRow>

</merge>

但是当Activity即将开始时,我遇到了这个例外:

  

merge只能与有效的ViewGroup root一起使用   attachToRoot =真    - 使用getLayoutInflater

1 个答案:

答案 0 :(得分:5)

<merge>元素现在似乎不支持ViewStub标记:

  

ViewStub的唯一缺点是它目前不支持   标签。

Romain Guy's post on layout tricks

最后,我使用Activity的{​​{1}}在LayoutInflater中添加了其他行:

TableLayout

由于我只想在ViewGroup rootTableLayout = (ViewGroup) findViewById(R.id.root_table_layout); getLayoutInflater().inflate(R.layout.merge_table_1, rootTableLayout, true); 处附加一些TableRows,因此该解决方案有效。对于更复杂的场景(在ViewGroup中间动态包含TableRows),我仍然不知道这样做的正确方法。