自定义视图:如何设置根布局

时间:2013-12-15 18:01:40

标签: android layout

我正在尝试创建一个自定义视图(扩展RelativeLayout),它包含了很多其他视图。 我想在xml布局文件中创建子视图。现在我想知道如何扩展该布局并在我的自定义视图中使用它。像这样的东西会很棒(在我的自定义视图中):

RelativeLayout rootLayout = (RelativeLayout) inflater.inflate(my xml file)
this.setContenView(rootLayout);

不幸的是,这只能在活动中实现。观点有类似之处吗?

编辑: 我不想使用View.addView(rootLayout)导致添加另一个视图层次结构,这是不需要的。

3 个答案:

答案 0 :(得分:4)

您可以尝试使用<merge>标记作为布局中的根元素,并在自定义RelativeLayout中将其充气,其中this为父级,attachToRoot设置为true。您不必再拨打addView

以下是LinearLayout(页面底部)的类似示例,应与RelativeLayout too配合使用。

答案 1 :(得分:1)

使用以下

View v =getLayoutInflater().inflate(R.layout.mylayout,null);
// inflate mylayout.xml with other views
CustomRelativeLayout cs = new CustomRelativeLayout(this);
// CustomRelativeLayout is a class that extends RelativeLayout
cs.addView(v);  // add the view to relative layout
setContentView(cs); // set the custom relative layout to activity

示例:

<?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" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="111dp"
        android:text="TextView" />

</RelativeLayout>

SView

public class SView extends RelativeLayout {

    Paint p,paint; 
    public SView(Context context) {
        super(context);
        TextView tv = new TextView(context);
        tv.setText("hello");
        this.addView(tv);
    }
}

在MainActivtiy

View v =getLayoutInflater().inflate(R.layout.mylayout,null);
SView cs = new SView(this);
cs.addView(v);
setContentView(cs);

对齐

enter image description here

编辑:

如果您希望在CustomRelative布局中充气

在构造函数

LayoutInflater inflater = LayoutInflater.from(context);
View v =inflater.inflate(R.layout.mylayout,null);
TextView tv = new TextView(context);
tv.setText("hello");
this.addView(tv);
this.addView(v);

答案 2 :(得分:0)

在您的视图中,您可以从上下文中获取布局inflater,为儿童充气并将其添加到thisRelativeLayout的子类)

final LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View child = inflater.inflate(R.layout.custom_layout, this, false);
// Then add child to this (subclass of RelativeLayout)
this.addView(child);

编辑:

上面的代码显示了如何在自定义视图中为儿童充气。 This link显示了如何将自定义视图本身插入XML布局。