我想创建一个自定义布局以减少代码中的冗余。目前,每个布局文件都有大约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问题?
答案 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>