自定义视图xml与其用法

时间:2018-01-18 09:55:45

标签: android xml android-custom-view

我有一个自定义视图CustomSettingEntry这是它的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_custom_setting_entry_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/custom_setting_entry_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </RelativeLayout>
</LinearLayout>

然后我在片段中使用它并为其分配一个id:

<com.mypackage.name.CustomSettingEntry
                android:id="@+id/layout_notification_setting"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:setting_title="@string/title"
                app:setting_subtitle="@string/subtitle" />

我的问题是ID为layout_custom_setting_entry_container的LinearLayout与ID为layout_notification_setting的用法之间的区别是什么?他们是指同一件事吗?

如果我在片段内的自定义视图上设置了一个单击侦听器,那么稍后在某些情况下禁用单击自定义视图中的根LinearLayout,这会停止监听器吗?

1 个答案:

答案 0 :(得分:1)

我理解您的自定义视图是LinearLayout的子类,它会扩展xml布局。如果是,则生成的视图层次结构为

[LinearLayout (actually a CustomSettingEntry), id : layout_notification_setting]
    [LinearLayout, id : layout_custom_setting_entry_container]
        ... 

所以有两个级别的视图组,每个视图组都有自己的id。

顺便说一下,这是低效的,因为外部视图组(您的自定义类)只有一个子节点(xml的根节点)。

解决方案是使用<merge>作为xml布局的根目录跳过一个级别。见Optimize by merging Inflating layout for your custom view  了解更多详情。