Ответ 1
Совершенно возможно и рекомендуется создавать пользовательские представления контейнеров. Это то, что 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, в конкретный дочерний контейнер.
И затем измените XML как таковой:
Рез/макет/custom_layout.xml
<merge>
<SomeView />
<SomeOtherView />
<!-- maybe more layout stuff here later -->
<LinearLayout
android:id="@+id/content" />
</merge>
Причиной использования <merge>
является упрощение иерархии. Все дочерние представления привязаны к вашему пользовательскому классу, который является RelativeLayout
. Если вы не используете <merge>
, вы получите RelativeLayout
, прикрепленный к другому RelativeLayout
, прикрепленному ко всем дочерним элементам, что может вызвать проблемы.
НТН