今天遇到一个很奇葩的问题,关于id重复的,记录下。
页面的整体布局比如是这样:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/light_background" android:orientation="vertical" <include layout="@layout/toolbar"/> <com.shenhuniurou.widget.FilterView android:id="@+id/filter_view" android:layout_width="match_parent" android:layout_height="45dp"/> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" android:dividerHeight="10dp"/> </LinearLayout>
可以看到,其中有一个用于展示数据列表的ListView,它的id为listview,FilterView
是我自定义的一个分类筛选的view,它也有自己的布局,关键是在它的布局中,我也放了一个ListView用来展示分类数据,巧了,它的id我也没注意,写成了listview,如下:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/view_mask_bg" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:background="@color/halftransparent"/> <LinearLayout android:id="@+id/ll_content_list_view" android:layout_width="match_parent" android:layout_height="360dp" android:orientation="horizontal" android:visibility="visible"> <ListView android:id="@+id/lv_category" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#e0e0e0" android:divider="#d9d9d9" android:dividerHeight="1dp" android:scrollbars="none" android:visibility="gone"/> </LinearLayout> </FrameLayout>
然后问题来了,我是用的ButterKnife获取view实例的,as编译也没报错,列表数据的listview设置了adapter之后,数据一直无法显示出来,仔细检查代码逻辑也没发现问题,再检查xml布局,发现listview的id一样,修改一个之后,运行正常了。
得出的结论就是,在自定义view里面使用了xml布局,在整体页面的xml中使用自定义view也就相当于include
或merge
了自定义view中的xml,,虽然编译不会报错,但是findViewById时始终得到的是页面布局顺序中相同id的第一个view的实例。