片段后面的不可见布局被点击:
Posted
技术标签:
【中文标题】片段后面的不可见布局被点击:【英文标题】:An invisible layout behind the fragment is getting clicked: 【发布时间】:2014-02-04 04:24:28 【问题描述】:我创建了几个片段,并通过以下方式添加第一个片段:
mainFragment = (MainFragment) MainFragment.create();
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
.add(R.id.content, mainFragment, MAIN_FRAGMENT_TAG)
.commit();
第二个片段是这样添加的:
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
//.hide(mainFragment)
.add(R.id.content,VenueFragment.create(vid), "Venue Fragment")
.addToBackStack(null)
.commit();
setDrawerIndicatorEnabled(false);
现在您看到隐藏方法未应用于此事务,并且打开了VenueFragment
,但在这种情况下的问题是,当VenueFragment
打开时(并且它是全屏视图)按下空白部分这个片段的调用调用MainFragment
可点击视图。 如何防止这种情况发生?
如果我使用隐藏选项,那么它就不会发生,但由于某种原因,删除 MainFragment
的动画正在上升,这会产生一种奇怪的体验。
【问题讨论】:
将第二个片段视图的可点击属性设置为真。 schemas.android.com/apk/res/android" android:layout_ android:layout_ android:clickable="true" /> @faiziii,如果你仔细看,你会发现这正是接受的答案中指定的内容。 【参考方案1】:您需要使VenueFragment
的根ViewGroup
可点击,以便它处理点击事件并且它们不会(在z 顺序意义上)传递给另一个Fragment
。
【讨论】:
你的意思是我在第二个 Fragment 中添加了 VenueFragment? 好的,但即使这样可行,它看起来也可以解决问题。谷歌并没有打算这样或这样处理。有没有其他方法可以解决这个问题? 我不知道。我遇到了同样的问题,这是我找到的唯一解决方案。必须有另一种方式。 现在我们知道为什么会发生这种情况了,这实际上是有道理的。你的答案是最容易完成的。所以谢谢。 好吧,当我看到您的解决方案时,我不得不承认我最初的想法是“哈哈,老兄”……但它确实有效!谢谢。【参考方案2】:将第二个片段视图的可点击属性设置为 true。
例如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:clickable="true" />
【讨论】:
【参考方案3】:在 VenueFragment 上设置 onClickListener 会起作用,但我会添加更多解释。让主片段获得触摸事件是为了处理场地片段透明的情况。在这种情况下,期望触摸通过您的透明视图到达下方是合理的。因此,android 会传递触摸事件,直到它们可以被处理。设置一个 onClickListener 将处理该事件,防止它被传递到下一个视图。如果您想“正确”防止点击下部片段,有几个选项:
-
从 OnPause 的主片段中移除 onClickListener,并在 OnResume 中设置它。这样,只要主片段不是活动片段,就无法单击它。
子类化您的 VenueFragment 中的***布局并覆盖 OnTouchEvent 以返回 true。这本质上与设置 onClickListener 的作用相同,但您可能会发现它使您阻止所有触摸事件的意图更加清晰。
【讨论】:
感谢您的解释和 +1,但说实话,我在第一个答案中收到的选项有效,它基本上与您解决此问题的第二个选项相同。只有没有继承的所有混乱,然后在布局中使用这个自定义类。【参考方案4】:嗯,非常快速的答案是片段中布局属性顶部的android:clickable="true"
。
但是,如果您创建一个 Activity 并带有 FrameLayout 及其 id 并且该 中没有其他元素,那将是一个更好的做法>活动。 因此,当您希望在屏幕上显示 片段 时,请调用该活动并使用
getSupportFragmentManager().beginTransaction()
.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
.replace(R.id.frameLayoutId, mainFragment, MAIN_FRAGMENT_TAG)
.commit();
使用 replace 代替 add 以便 frameLayout 的 activity 被 frameLayoutId
给出的片段布局替换【讨论】:
【参考方案5】:我有一个更好的解决方案,至少我认为是这样的:P。
片段交易时,使用隐藏和显示方法。
【讨论】:
这不是一个更好的解决方案,因为有时你想留下后面的片段(例如:当顶部片段不是全屏片段时)。在这种情况下,您需要留下两个片段。那你会怎么做?以上是关于片段后面的不可见布局被点击:的主要内容,如果未能解决你的问题,请参考以下文章