复合布局

时间:2014-10-09 10:53:00

标签: android android-layout

我想创建一个自定义布局以减少代码中的冗余。目前,每个布局文件都有大约30行相同的代码。

我的目标是创建一个可以容纳孩子的自定义布局/视图。

<BaseLayout xmlns:...>
   <!-- Normal Content -->
   <Button /> 
   <Label /> 
</BaseLayout>

虽然上面的xml包含大部分内容,但BaseLayout本身就是一个包含其他视图和功能的xml:

<FrameLayout xmlns:...>
   <LinearLayout><!-- contains the Header--></LinearLayout>

   <LinearLayout><!-- INDIVIDUAL CONTENT HERE--></LinearLayout>

   <FrameLayout><!-- contains the loading screen overlay --></FrameLayout>
</FrameLayout>

因此,应将上述xml中的所有子项插入到第二个线性布局中。我已经成功地这样做了。但我面临布局问题(匹配父母不匹配父母,只有包装)

我的方法是使用以下逻辑扩展LinearLayout:

/**
 * extracting all children and adding them to the inflated base-layout
 */
@Override
protected void onFinishInflate() {
    super.onFinishInflate();

    View view = LayoutInflater.from(getContext()).inflate(R.layout.base_layout, null);

    LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.base_layout_children);
    while(0 < getChildCount())
    {
        View child = getChildAt(0);
        LinearLayout.MarginLayoutParams layoutParams = (MarginLayoutParams) child.getLayoutParams();
        removeViewAt(0);
        linearLayout.addView(child, layoutParams);
    }
    this.addView(view);
}

是否有更好,更清晰的方法来封装xml并重用基础布局?如何解决match_parent问题?

2 个答案:

答案 0 :(得分:0)

在写这篇文章并思考如何解释最佳时,match_parent问题的解决方案变得清晰。虽然问题仍然存在,但是对于整个问题是否有更好的方法。

//Solution:
this.addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

//wrong:
this.addView(view);

答案 1 :(得分:0)

假设您有两个布局文件。 common_views.xml和layout_main.xml。您可以将一个布局文件的内容包含在另一个布局文件中。

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <include
            android:id="@+id/common"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"                
            layout="@layout/common_views" />

        <WebView
            android:id="@+id/webView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/common"
           >
        </WebView>

    </RelativeLayout>