【问题标题】:Dismissing ActionBar Spinner when an item is selected选择项目时关闭 ActionBar Spinner
【发布时间】:2014-05-03 20:13:09
【问题描述】:

对于我的项目,我有一个绑定到 ActionBar 的 Spinner。我已经为 Spinner 实现了一个自定义适配器,它扩展了 BaseAdapter 并实现了 SpinnerAdapter。我将其作为自定义适配器执行此操作,因为我的 Spinner 必须显示带有克拉的展开/折叠节点,并使用特殊复选标记来指示用户在树中选择要选择的节点。所有这一切都工作正常,除了当用户按下一个节点进行选择时,我不知道如何关闭 Spinner。它只是挂起,直到用户通过按下顶视图(最初用于展开 Spinner 的按钮)或按下后退按钮来折叠它。显然我在我的 SpinnerAdapter 的实现中忽略了一些东西,但我很想发现它是什么。我有自定义 ViewGroups 在适配器中膨胀,他们的一些孩子有自己的点击处理程序。这会弄乱我的 Spinner 吗?

【问题讨论】:

  • 当我用普通的文本视图替换我的自定义视图时,微调器按预期工作。所以,大概我在自定义视图实现中犯了一个错误。
  • 我实际上认为 ActionBar 的 Spinner 不适合用于继承自 ViewGroup 或呈现为可点击的任何内容。

标签: android android-actionbar android-spinner android-adapter


【解决方案1】:

好的,知识渊博的Ian Lake 为我提供了答案。

我的理解是,当列表上的顶级项目(您的单个列表项目)被允许具有焦点并且不响应点击事件时,操作栏的 Spinner 将响应点击事件。但是,如果您使用 ViewGroups 作为列表项,并且您有可以接受点击事件的子视图,除非您明确阻止它,否则它们将窃取焦点,并且您的 Spinner 将永远不会处理点击事件。有时,这正是您想要的:您可能在布局中有一些开关,您希望允许用户在不折叠 Spinner 的情况下进行切换。但是,如果这不是您想要的,那么您有两种选择:

  1. 您可以将属性android:descendantFocusability="blocksDescendants" 放入布局的根元素中,以确保焦点不会转到布局的子视图;或

  2. 您可以将属性android:focusable="false" 放在您的任何可聚焦的子视图中。

如果此时您的子视图仍有自己的点击处理程序,它们仍会响应点击事件,这将防止 Spinner 崩溃。如果这不是您想要的,那么您必须删除点击处理程序并使这些视图不可点击。

上述讨论中的任何错误都是我个人的,而不是 Ian 的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多