碎片不应该有一个选项来保留其视图层次结构中的点击事件吗?

Emm*_*uel 8 android android-fragments

在这里看到关于"将"点击事件"传递"到底层可点击的几个问题后,我回想起我曾经遇到过这个问题.实际发生的是,如果用户点击最顶部的空白区域,因为它不可点击,该事件将由可方便地放置在用户手指下方的可点击(即)处理.我通过制作顶部的可点击来修复它.那时候我没有多想,但这个解决方案似乎有点"hacky".FragmentsViewsFragmentsFragmentViewGroupViewButtonFragmentViewGroup

我知道View默认情况下不可点击的拦截点击事件是正常的行为,但是人们会认为,一个很大的用途Fragments是显示视图层次结构(由Activity之前唯一完成的任务)它会Activity在这个意义上类似于一个.当一个人Activity触发Intent创建一个新的Activity,然后这个Activity在屏幕上时,没有任何点击事件被传递到底层Activity.我意识到一个Activity可以包含许多Fragments可能无法填满整个屏幕甚至没有xml的东西,但有时候点击事件只能由最顶层保留Fragment.

尽管如此,这里提出的问题是:

1)设置ViewGroupFragment可点击的最佳解决方法是什么?

2)这个功能是否存在而且我不知道它?如果没有,应该吗?

Com*_*are 7

将ViewGroup设置为最顶级片段是解决此问题的最佳方法吗?

假设您的UI类似于您链接到的问题的UI,则UI编写不正确.

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

这在几个层面上是愚蠢的.您不仅遇到此触摸事件传播问题,而且还有透支问题,因为Android将渲染按钮,然后在其上呈现黑色背景.

这里正确答案是B replace()A.

(我意识到开发人员实际上没有片段A,但在活动中有这些小部件,这为该UI增加了另一层次的草图)

更一般地说,我不会在Z轴上有更高的碎片或其他任何东西,意图隐藏底层小部件.因此,例如,在Z轴上具有更高VideoView弹出窗口的全屏幕MediaController是很好的,因为控制器将拾取发往控制器的触摸事件,但是用户仍然可以点击部分VideoView不是被控制器阻止.相反,我不会通过在Z轴上WebView覆盖另一个WebView来实现选项卡式Web浏览器- 要么只有一个WebView,要么只有一个可见 WebView(另一个从视图层次中删除或标记为View.GONE).

当一个Activity触发Intent创建一个新Activity,然后此Activity在屏幕上时,没有任何点击事件传递给底层Activity.

这是因为在视图层次结构方面没有"底层活动".从技术上讲,每个活动都是独立的Window,因此即使最顶层Window没有填满屏幕(例如,以对话为主题的活动),"基础活动"也是可见的,但不能接收触摸事件.

我意识到一个Activity可以包含许多片段,这些片段可能无法填满整个屏幕甚至没有xml,但有时候点击事件只能由最顶层的片段保留.

恕我直言,"最顶级片段"下面不应该有任何东西.在进行此类UI切换时使用replace(),而不是add().或者,使用a DialogFragment,如果你想暂时拥有一些模态接管前景输入(Window如果我理解正确的话,对话框会自动获得).不要只是绘制一个坚实的背景,并假装其他小部件,现在涂在上面,不存在.

这个功能是否存在而且我不知道它?

不,因为片段不是ViewGroups,因此不参与管理触摸事件的路由.

如果没有,应该吗?

恕我直言,不,虽然欢迎您提出问题.