如果我替换" include"在布局xml文件中使用自定义视图类标记标记,为什么?

时间:2016-11-08 02:43:23

标签: android xml layout android-custom-view

我已经按照部分"创建复合视图"在this guide。在我的应用程序中的一个活动中,有如下定义的视图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- some other subviews... -->

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent">

        <!-- some other subviews... -->

        <include
            android:id="@+id/myHeaderView"
            layout="@layout/view_my_header"></include>

    </FrameLayout>
</LinearLayout>

自定义myHeaderView的布局在xml文件中定义如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="250dip"
    android:orientation="vertical"
    android:background="@android:color/transparent">

    <View
        android:layout_height="5dip"
        android:layout_width="match_parent"
        app:layout_aspectRatio="100%"
        android:background="@android:color/holo_green_light" />

    <View
        android:id="@+id/yellowView"
        app:layout_heightPercent="50%"
        app:layout_aspectRatio="100%"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:background="@android:color/holo_orange_light"
        android:layout_marginBottom="12dp"
        android:layout_marginLeft="12dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true" />

    <View
        android:id="@+id/redView"
        app:layout_heightPercent="40%"
        app:layout_aspectRatio="200%"
        android:background="@android:color/holo_red_light"
        android:layout_width="200dip"
        android:layout_height="100dip"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true" />

    <View
        android:layout_height="5dip"
        android:layout_width="match_parent"
        app:layout_aspectRatio="100%"
        android:background="@android:color/holo_green_light"
        android:layout_alignParentBottom="true"/>

</android.support.percent.PercentRelativeLayout>

基本上它应该是这样的:

enter image description here

运行良好,自定义视图按预期显示。但是,如果我使用以下内容替换xml中自定义视图元素的include标记:

<com.myDomain.myHeaderView
    android:id="@+id/myHeaderView"
    android:layout_width="match_parent"
    android:layout_height="250dip"
    android:orientation="vertical"
    android:background="@android:color/transparent"/>

并更新自定义类MyHeaderView的构造函数,如下所示:

public MyHeaderView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(context);
}

// some other constructor implementations, which they all call "initView(context)"

private void initView(Context context) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.view_my_header, this, true);
}

自定义标题视图的子视图(例如黄色视图)将消失。我查看了设备监视器的布局视图,看起来标题视图的大小及其子视图是正常的。但由于某些原因我不知道,它们不可见。

我做错了吗?我知道include标记表示我正在重复使用相应文件定义的布局组件,但我想将自定义视图引用为类MyHeaderView而不是{{1}所以我可以调用其中定义的方法,因此更新视图,我该如何实现呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试将<include>置于<MyHeaderView>内而不是MyHeaderView中充气:

<com.myDomain.MyHeaderView
android:id="@+id/myHeaderView"
android:layout_width="match_parent"
android:layout_height="250dip"
android:orientation="vertical"
android:background="@android:color/transparent">

    <include        
        layout="@layout/view_my_header"/>

</com.myDomain.MyHeaderView>