对于我的项目,我有一个Spinner绑定到ActionBar。我为Spinner实现了一个自定义适配器,它扩展了BaseAdapter并实现了SpinnerAdapter。我这样做是一个自定义适配器,因为我的Spinner必须显示带有克拉的扩展/折叠节点,以及特殊的复选标记,以指示用户选择树中的节点。所有这一切都运行正常,除非用户按下一个节点进行选择,我不知道如何解雇Spinner。它只是挂起,直到用户通过按顶视图(用于首先展开微调器的按钮)或按下后退按钮来折叠它。显然我在我的SpinnerAdapter的实现中忽略了一些东西,但我很适合尝试发现它是什么。我有自定义的ViewGroups在适配器中膨胀,他们的一些孩子有自己的点击处理程序。这搞砸了我的Spinner吗?
答案 0 :(得分:1)
好的,我非常了解Ian Lake。
我的理解是,当列表中的顶级项目(您的个人列表项目)被允许具有焦点而不会以其他方式响应点击事件时,Action Bar的Spinner将响应点击事件。但是,如果您使用ViewGroups作为列表项,并且您有可以接受点击事件的子视图,除非您明确地阻止它,它们将窃取焦点,并且您的Spinner将永远不会处理点击事件。有时,这正是您想要的:您可能在布局中有一些开关,您希望允许用户切换而不会折叠Spinner。但是,如果它不是您想要的,那么您有几个选择:
您可以将属性android:descendantFocusability="blocksDescendants"
放入布局的根元素中,以确保焦点不会转到布局的子视图;或
您可以将属性android:focusable="false"
放到任何可以调焦的子视图中。
如果此时您的子视图仍然有自己的点击处理程序,它们仍会响应点击事件,这将阻止Spinner折叠。如果这不是您想要的,那么您必须删除点击处理程序并使这些视图不可点击。
上述讨论中的任何错误都是我自己的,而不是伊恩。