我创建了几个片段,并按以下方式添加第一个片段:
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
的动画正在上升,这会产生奇怪的体验。
答案 0 :(得分:35)
您需要使ViewGroup
的{{1}}根可以点击,以便处理点击事件,并且它们不会向下传递(在z顺序中)到另一个VenueFragment
。< / p>
答案 1 :(得分:13)
将第二个片段视图上的可点击属性设置为true。
例如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
答案 2 :(得分:7)
在VenueFragment上设置onClickListener会有效,但我会再添加一些解释。使主片段获得触摸事件是用于处理场地片段是透明的情况的行为。在这种情况下,可以合理地预期触摸通过您的透明视图到下面的那个。因此,android会通过触摸事件直到可以处理它们。设置onClickListener将处理该事件,防止将其传递给下一个View。如果您希望“正确”防止对较低片段的点击,可以选择以下几种方法:
答案 3 :(得分:1)
很快,答案是片段中布局属性顶部的android:clickable="true"
。
但如果您使用 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();
使用 替换 而不是 添加 ,以便 frameLayout < strong>活动由 frameLayoutId
给出的片段布局取代答案 4 :(得分:0)
我有一个更好的解决方案,至少我认为:P。
在片段事务中,使用hide和show方法。