Android:使用现有布局的自定义视图的多个视图子项

我必须在Android中构build更复杂的自定义视图。 最终的布局应该是这样的:

<RelativeLayout> <SomeView /> <SomeOtherView /> <!-- maybe more layout stuff here later --> <LinearLayout> <!-- the children --> </LinearLayout> </RelativeLayout> 

然而,在XML文件中,我只是想定义这个(不定义SomeView,SomeOtherView等):

 <MyCustomView> <!-- the children --> </MyCustomView> 

这是可能的Android,如果是的话:什么是最干净的方式来做到这一点? 我想到的可能的解决scheme是“覆盖addView()方法”和“删除所有视图,并在以后再次添加”,但我不确定要走哪条路…

提前感谢您的帮助! 🙂

Solutions Collecting From Web of "Android:使用现有布局的自定义视图的多个视图子项"

创build自定义容器视图是完全可能的,也是鼓励的。 这就是Android所谓的复合控制。 所以:

 public class MyCustomView extends RelativeLayout { private LinearLayout mContentView; public MyCustomView(Context context) { this(context, null); } public MyCustomView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyCustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); //Inflate and attach your child XML LayoutInflater.from(context).inflate(R.layout.custom_layout, this); //Get a reference to the layout where you want children to be placed mContentView = (LinearLayout) findViewById(R.id.content); //Do any more custom init you would like to access children and do setup } @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { if(mContentView == null){ super.addView(child, index, params); } else { //Forward these calls to the content view mContentView.addView(child, index, params); } } } 

您可以根据需要覆盖多个版本的addView() ,但最终它们都会调用我放入示例中的版本。 重写这个方法会让框架将所有在其XML标签中find的子元素传递给一个特定的子容器。

然后修改XML如下:

RES /布局/ custom_layout.xml

 <merge> <SomeView /> <SomeOtherView /> <!-- maybe more layout stuff here later --> <LinearLayout android:id="@+id/content" /> </merge> 

使用<merge>的原因是为了简化层次结构。 所有的子视图将被附加到您的自定义类,这是一个RelativeLayout 。 如果不使用<merge> ,则最终RelativeLayout附加到附加到所有子项的另一个RelativeLayout ,这可能会导致问题。

HTH

你可以使用包含标签

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include android:id="@+id/nav_bar_layout" layout="@layout/nav_bar" android:layout_above="@+id/web_view" /> <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/web_view" android:layout_centerInParent="true" /> <include android:id="@+id/admob_layout" layout="@layout/admob_layout" android:layout_below="@+id/web_view" /> </RelativeLayout>