带有<merge>和<layout>标签的自定义视图

时间:2016-08-24 09:47:32

标签: android android-layout layout merge

我尝试将原生Android Studio数据绑定功能与自定义布局结合使用。 我的自定义布局如下所示:

public class MainNavigationEntryView extends LinearLayout {

    private MainNavigationEntryBinding layoutBinding;

    public MainNavigationEntryView(Context context) {
        super(context);
        init(context, null);
    }

    [...]

    private void init(Context context, AttributeSet attrs) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        layoutBinding = MainNavigationEntryBinding.inflate(inflater, this, true);
        [...]
    }
}

我的布局文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/imageIcon"
            android:layout_width="@dimen/tabbar_icon_size"
            android:layout_height="@dimen/tabbar_icon_size"
            android:layout_marginTop="4dp"
            android:background="@drawable/stateful_background_no_bounds"
            android:gravity="center"
            tools:ignore="contentDescription"/>

        <ImageView
            android:id="@+id/imageIndicator"
            android:layout_width="@dimen/indicator_size_small"
            android:layout_height="@dimen/indicator_size_small"
            android:src="@drawable/background_circle_blue"
            android:visibility="gone"
            tools:visibility="visible"
            tools:ignore="contentDescription"/>

    </LinearLayout>

</layout>

这里的问题是我有两个嵌套的LinearLayout。我尝试使用<merge> tag来减少它,但似乎无法将<layout><merge>标记放在一个布局中。

是否有另一种方法可以在一个版面中将<layout><merge>标记组合在一起?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为您不能使用<layout>嵌套<merge>标记。

但是你可以做一件事来避免两个嵌套的LinearLayout。

你的布局:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <com.example.MyCustomView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/imageIcon"
            android:layout_width="@dimen/tabbar_icon_size"
            android:layout_height="@dimen/tabbar_icon_size"
            android:layout_marginTop="4dp"
            android:background="@drawable/stateful_background_no_bounds"
            android:gravity="center"
            tools:ignore="contentDescription"/>

        <ImageView
            android:id="@+id/imageIndicator"
            android:layout_width="@dimen/indicator_size_small"
            android:layout_height="@dimen/indicator_size_small"
            android:src="@drawable/background_circle_blue"
            android:visibility="gone"
            tools:visibility="visible"
            tools:ignore="contentDescription"/>

    </com.example.MyCustomView>
</layout>

您的自定义视图:

public class MyCustomView extends LinearLayout {

    private MyCustomViewBinding binding;

    public MyCustomView(Context context) {
        super(context);
    }

    [...]

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        binding = MyCustomViewBinding.bind(this);
    }

}