点击片段后面的隐形布局:

时间:2014-01-15 15:45:02

标签: android android-fragments fragmenttransaction fragmentmanager

我创建了几个片段,并按以下方式添加第一个片段:

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的动画正在上升,这会产生奇怪的体验。

5 个答案:

答案 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。如果您希望“正确”防止对较低片段的点击,可以选择以下几种方法:

  1. 从OnPause中的主片段中删除onClickListener,并在OnResume中设置它。这样,只要主片段不是活动片段,就不能单击它。
  2. 在VenueFragment中对顶级布局进行子类化,并重写OnTouchEvent以返回true。这基本上与设置onClickListener完全相同,但您可能会发现它使您打算更清楚地阻止所有触摸事件。

答案 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方法。