Android自定义View内部ID与引用ID的区别及点击事件疑问
Android自定义View ID与点击事件问题解答
问题1:两个ID的区别及是否指向同一对象
这两个ID完全属于不同层级的标识,绝对不是同一个对象:
layout_custom_setting_entry_container是你自定义ViewCustomSettingEntry内部根布局(LinearLayout)的ID,它属于CustomSettingEntry的子View,作用范围仅限自定义View内部,用来在CustomSettingEntry的代码中定位这个LinearLayout实例。layout_notification_setting是你在Fragment布局中给CustomSettingEntry这个自定义View本身设置的ID,作用范围是Fragment的布局层级,用来在Fragment代码中找到整个CustomSettingEntry实例。
简单说,一个是自定义View内部子控件的标识,一个是自定义View作为整体在父布局中的标识,对应两个完全不同的View对象。
问题2:禁用内部LinearLayout的点击是否会终止Fragment中设置的监听器响应
不会,除非你直接禁用自定义View本身的点击状态。原因和Android的点击事件传递机制有关:
- 你在Fragment中给
CustomSettingEntry设置的点击监听器,是绑定在整个自定义View实例上的。 - 内部的LinearLayout如果没有自己的点击监听器,默认不会消费点击事件——点击事件会从LinearLayout向上冒泡,最终传递到CustomSettingEntry,触发你设置的监听器。
- 当你禁用内部LinearLayout的点击(比如调用
setClickable(false)或setEnabled(false)),只是让这个LinearLayout本身不再响应点击,但它依然会把未消费的事件向上传递给父View(也就是CustomSettingEntry),所以你在Fragment中设置的监听器还是会正常响应。
如果想要终止这个监听器的响应,你需要直接给CustomSettingEntry实例调用setClickable(false)或者setEnabled(false),而不是去操作它内部的LinearLayout。
内容的提问来源于stack exchange,提问作者y.allam
相关产品推荐
相关产品推荐

