自定义视图将其内容包装在特定的子视图中

时间:2016-10-03 13:13:27

标签: android

给出以下带有自定义视图“RowWrapperView”的示例布局:

(row_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<com.example.android.RowWrapperView
    xmlns:android="http://schemas.android.com/apk/res/android"
    ...  >
    <Button android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button android:id="@+id/btn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</com.example.android.RowWrapperView>

视图有一个膨胀的布局(view_row_wrapper.xml),其中的LinearLayout的id为“R.id.container”:

public class RowWrapperView extends RelativeLayout {
    public RowWrapperView(Context context) {
        super(context);
        init();
    }
    public RowWrapperView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public RowWrapperView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public LinearLayout container;
    private void init() {
        inflate(getContext(), R.layout.view_row_wrapper, this);
        container = (LinearLayout) findViewById(R.id.container);
    }
}

(view_row_wrapper.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    ...  >
    <LinearLayout
        android:id="@+id/something"
        android:orientation="horizontal" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
        <Button android:id="@+id/test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        ...
    </LinearLayout>

    <LinearLayout
        android:id="@+id/container"
        android:orientation="horizontal" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
        <!-- Trying to get the content of the view here -->
    </LinearLayout>

    <LinearLayout
        android:id="@+id/something_else"
        android:orientation="horizontal" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
        ...
        <TextView
            android:id="@+id/message_sender"
            tools:text="Jon Snow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>

我要做的是在R.id.container中获取“RowWrapperView”(row_item.xml)的内容。

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

Inflater有返回类型 - 视图,您必须将此视图添加到布局中然后搜索它 在不添加布局视图的情况下尝试此操作

 private void init() { 
    View view = inflate(getContext(), R.layout.view_row_wrapper, this);
    container = (LinearLayout) view.findViewById(R.id.container);
}

或添加到布局

 private void init() { 
    View view = inflate(getContext(), R.layout.view_row_wrapper, this);
    addView(view);
    container = (LinearLayout) findViewById(R.id.container);
}

答案 1 :(得分:0)

我想你可能会这样做:

class Feature

用于将所有元素添加到容器中。