使用选择器和 isEnabled() 禁用列表视图项目
范围: - 使用重写的ArrayAdapter; - 使用选择器; - 使用 isEnabled 禁用项目。
目标: - 禁用某些列表项并通过选择器加载禁用状态视图。
问题: - 一切正常(自定义视图、未聚焦、聚焦和按下状态的选择器),但禁用的项目不使用禁用状态的选择器。
调查:当我使用 isEnabled 禁用列表视图层次结构查看器中的某些项目时,显示禁用的项目不可聚焦、不可点击,但(!)已启用。
这是一个错误还是缺少什么?
PS 实际上,文档说 isEnabled 不会对列表项执行 setEnabled(false) 操作,它使其成为分隔符(?)对象。 PPS 我还尝试使用 if 语句将我的视图(在 getView 中)设置为 isEnabled(false)。但它只适用于重点项目?
我的选择器看起来像:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Disabled -->
<item
android:state_enabled="false"
android:textColor="@color/greyDark"
android:drawable="@drawable/list_item_disabled" />
<!-- Pressed -->
<item
android:state_enabled="true"
android:state_pressed="true"
android:textColor="@android:color/white"
android:drawable="@drawable/list_item_pressed" />
<!-- Focused -->
<item
android:state_enabled="true"
android:state_focused="true"
android:textColor="@android:color/white"
android:drawable="@drawable/list_item_focused" />
<!-- Default -->
<item
android:state_enabled="true"
android:drawable="@drawable/list_item_unfocused" />
</selector>
Scope:
- using overriden ArrayAdapter;
- using selector;
- using isEnabled for disabling items.
Aim:
- disable some list items and load disabled state view via selector.
Problem:
- everything works (custom view, selector for unfocused, focuesd and pressed states) but disabled items don't use selector for disabled state.
Investigating: when I use isEnabled for disabling some items in listview Hierarchy Viewer shows that disabled items are unfocusable, unclickable but(!) enabled.
Is it a bug or something is missing?
P.S. actually, docs say that isEnabled doesn't do setEnabled(false) for list item, it makes it a divider(?) object.
P.P.S I also tried to use if-statement to set my View (in getView) as isEnabled(false). But it works only for focused items?
My Selector looks like:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Disabled -->
<item
android:state_enabled="false"
android:textColor="@color/greyDark"
android:drawable="@drawable/list_item_disabled" />
<!-- Pressed -->
<item
android:state_enabled="true"
android:state_pressed="true"
android:textColor="@android:color/white"
android:drawable="@drawable/list_item_pressed" />
<!-- Focused -->
<item
android:state_enabled="true"
android:state_focused="true"
android:textColor="@android:color/white"
android:drawable="@drawable/list_item_focused" />
<!-- Default -->
<item
android:state_enabled="true"
android:drawable="@drawable/list_item_unfocused" />
</selector>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
适配器中的函数 isEnabled() 只会使项目不可聚焦和不可点击。
您需要在
adapter.getView()
末尾调用view.setEnabled()
以使选择器正常工作。此外,为了让父视图将启用状态传递给其后代,您需要在 xml 文件中为子视图指定属性
android:duplicateParentState="true"
。The function isEnabled() in the adapter only makes item unfocusable and unclickable.
You need to call
view.setEnabled()
at the end ofadapter.getView()
to make your selector functional.Also, for a parent view to pass enable state to its descendants, you need to specify the attribute
android:duplicateParentState="true"
to the child views in your xml file.黑客:
使用 getView 检查禁用的项目逻辑并使用另一个布局膨胀视图。 isEnabled 还是有用的。
Hack:
use getView to check disabled item logic and inflate view with another layout. isEnabled is still usefull.