【问题标题】:onClickListener doesn't always fire in fragmentonClickListener 并不总是在片段中触发
【发布时间】:2020-12-08 13:02:45
【问题描述】:

一个让我发疯了一段时间的问题(它阻止了发布到亚马逊应用商店,因为该应用已被禁止但现在我被这个错误困住了,他们不会重新发布它......)。

我有一个布局,左侧是列表,右侧是网格(如屏幕截图所示)。单击左侧列表中的项目(类别)调用 api,返回一些内容(电影)并将它们显示在右侧部分。然后,当您单击右侧片段中的电影时,应该会发生其他事情。

它已经工作了一段时间,没有用户抱怨过,它确实可以在某些设备上工作......例如,它可以在运行 android 7.1 的 amazon Fire 版本上工作,但不能在他们的 android 5.1 上工作,也不能在 android 9 版本上... [EDITED 16/12/2020:查看问题底部的编辑...通过更改库 - 降级回旧版本 - 现在似乎只发生在基于 Android 9 的消防设备和较旧的设备 - 5 和 7 - 都可以工作]

在有问题的设备上会发生这种奇怪的行为:如果您选择列表中的前三个项目之一,在右侧的网格中我的 onClickListener 不会触发。 从第 4 项开始,onClickListener 触发并且我的代码执行。

只有在使用遥控器/dpad 时才会发生这种情况......触摸事件也适用于前三个......但问题发生在某些型号的 Amazon Fire TV 和其他没有触摸和必须使用遥控器(在一个模拟器上我可以重现它,在另一个我不能...即使两者都运行 android 10...)

正确的部分是由片段组成的——它总是相同的片段,总是相同的 api 调用(只是作为 api 调用的参数的不同类别),总是返回并需要显示的相同类型的东西,传递通过相同的适配器、支架等...

我不知道该去哪里调查。我什至尝试过降级库、编译器等...非常类似于这个set onClickListener in getview() with ViewHolder class。我也检查了这个https://scottweber.com/2013/04/30/adding-click-listeners-to-views-in-adapters/,我得到了完全相同的行为......)但如果代码真的被破坏了,它永远不会工作......但事实上它“通常有效”但不是列表中的前三个项目让我感到困惑......正如我已经写过的那样:这将是相同的片段,相同的代码......非常奇怪。这就是为什么我怀疑平台/库/编译器问题.. ...但我不知道在哪里看...

编辑/更新于 2020 年 12 月 16 日:在我提交了一个版本之后,我降级了很多库和 gradle(并且我最终没有更改代码),然后我能够在亚马逊商店获得批准再次,但设备兼容性有限。基本上他们说它适用于最旧的设备,只在(一些)较新的设备上运行......很有趣。我还没有找到罪魁祸首,但至少有一种关于从哪里看的方向......

【问题讨论】:

  • 它似乎适用于 Android TV,但我想 Android 应用的策略也可以在这里奏效。你在使用 RecyclerView 吗?而且,您是否尝试过直接在您的活动中而不是在您的适配器中设置点击侦听器。我不知道这是否是它在 Android TV 中的工作方式。但如果是,那么你可以试一试。
  • 这不是一个 recyclerview - 它只是一个 android.widget.GridView 。它只需要在该屏幕尺寸上显示 6 个项目 - 或最多 16 个。我知道 RecyclerView 是当前的、更现代的、更节省内存的、更多的方式......但是有了这么多的项目,它真的听起来像是矫枉过正,没有真正的性能优势......这在非常旧的设备上运行得很好低至 android 5...
  • 其中包含的 Activity 已经是一段相当长的代码,它包含许多条件选择,可以根据外形尺寸(手机/平板电脑/电视)更改布局。左侧列表有onclicklistener,触发右侧片段的移除和添加或替换。然后,在右侧的片段中(在他们使用的适配器中),这是这些项目的点击侦听器所在的位置......将它们从活动绑定到活动并不真正了解的东西也会很麻烦关于或考虑一个黑盒子:被替换的片段......
  • 我确实尝试在左侧列表的“顶部”添加一些假项目,然后 - 哈哈,瞧 - 其余的,一旦以这种方式“向下移动”,它就会开始工作。太可笑了,我真的不知道在哪里看了......
  • 当它们不工作时,它只是与 REMOTE 不工作......因为触摸(如果可用)问题不存在:它只是工作。此外,在许多设备上,它仍然可以使用遥控器......仅在某些设备上不起作用,但我无法隔离任何具体差异以了解实际的、相关的差异......

标签: gridview onclicklistener android-tv android-viewholder amazon-fire-tv


【解决方案1】:

看来如果我设置

android:descendantFocusability="afterDescendants"

在 GridView 上,则工作更可靠。

我仍在对旧版本和新版本进行更多回归测试....我不知道为什么焦点窃取只发生在该片段的某些实例而不发生在其他片段...

我看到的有用的其他线程并帮助我朝着正确的方向前进(我必须购买新一代的新 Fire TV Stick 才能重现和调试它):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2014-02-15
    相关资源
    最近更新 更多