gpt4 book ai didi

android - fragment 不应该有一个选项来在它们的 View 层次结构中保留点击事件吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:50:54 24 4
gpt4 key购买 nike

在看到 couple 之后关于 SO 的问题,关于 Fragments 将他们的点击事件“传递”到底层 Fragments 中的可点击 Views,我记得我曾经遇到过这个问题。实际发生的情况是,如果用户点击最上面的 Fragment 的空白区域,由于其 ViewGroup 不可点击,事件将由可点击的 View(即 Button),方便地放置在用户手指下方。我通过使顶部 FragmentViewGroup 可点击来修复它。当时我并没有多想,但这个解决方案似乎有点“hacky”。​​

我知道对于默认情况下不可点击的 View 来说,不拦截点击事件是正常的行为,但是人们会认为考虑到 Fragments 是显示 View 层次结构(仅由 Activity 完成的任务),它在这个意义上类似于 Activity。当一个 Activity 触发 Intent 以创建一个新的 Activity,然后这个 Activity 出现在屏幕上时,没有点击事件传递给底层 Activity。我意识到 Activity 可以包含许多 Fragments 可能不会填满整个屏幕甚至没有 xml,但有时点击事件只意味着最顶层保留 fragment

说了这么多,问题来了:

1) 将最顶部的 Fragment 上的 ViewGroup 设置为可点击是解决此问题的最佳方法吗?

2) 是否存在此功能但我不知道?如果不是,应该吗?

最佳答案

Is setting the ViewGroup on the top most Fragment the best way to solve this?

假设您的 UI 类似于您链接到的问题中的 UI,则 UI 编写不当。

我对这个问题的用户界面的看法是,开发人员有两个 fragment ,A 和 B,每个 fragment 都填满了屏幕。 A 最初在那里,底部有三个按钮。然后,开发人员调用 add() 来显示 B,其中 B 具有不透明的黑色背景。

这在几个层面上是愚蠢的。您不仅会遇到此触摸事件传播问题,而且还会遇到 overdraw 问题,因为 Android 将渲染按钮,然后在它们之上渲染黑色背景。

这里的正确答案是用 B replace() A。

(我意识到开发人员实际上没有 fragment A,但在 Activity 中有那些小部件,这为该 UI 添加了另一个级别的粗略度)

更一般地说,我不会为了隐藏底层小部件而在 Z 轴上设置更高的 fragment 或任何其他内容。因此,例如,拥有一个全屏 VideoView,在 Z 轴上有一个弹出式 MediaController 就可以了,因为将选择发往 Controller 的触摸事件由 Controller 向上移动,但用户仍然可以点击未被 Controller 阻挡的 VideoView 部分。相反,我不会通过让一个 WebView 在 Z 轴上覆盖另一个 WebView 来实现选项卡式 Web 浏览器——要么只有一个 WebView,否则只有一个可见WebView(另一个从 View 层次结构中删除或标记为View.GONE)。

When one Activity fires the Intent to create a new Activity, and then this Activity is on the screen, no click events are delivered to the underlying Activity.

那是因为在 View 层次结构方面没有“底层 Activity ”。更技术地说,每个 Activity 都在它自己的 Window 中,因此即使最顶层的 Window 没有填满屏幕(例如,对话框主题的 Activity ),“底层 Activity ”可见但无法接收触摸事件。

I realize that an Activity can contain many Fragments that may not fill the whole screen or even have no xml, but sometimes click events are only meant to be retained by the top most Fragment.

恕我直言,那么“最上面的 fragment ”下面不应该有任何东西。在执行此类 UI 切换时,请使用 replace(),而不是 add()。或者,使用 DialogFragment,如果您想暂时让某些模态接管前景输入(如果我理解正确的话,因为对话框有自己的 Window)。不要只绘制纯色背景并假装现在已覆盖的其他小部件不存在。

Does this feature exist and I am not aware of it?

不,因为 fragment 不是 ViewGroups,因此不参与管理触摸事件的路由。

And if not, should it?

恕我直言,不,尽管欢迎您为其提出问题。

关于android - fragment 不应该有一个选项来在它们的 View 层次结构中保留点击事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21144782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com