32

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

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);

现在,正如您所见,该事务未应用 hide 方法,并且VenueFragment已打开,但在这种情况下,问题是当VenueFragment打开(并且它是全屏视图)按下此片段的空白部分时会调用MainFragment可点击视图的调用. 我怎样才能防止这种情况?

如果我使用隐藏选项,那么它不会发生,但由于某种原因,用于删除的动画MainFragment正在上升,这会产生一种奇怪的体验。

4

5 回答 5

44

您需要制作可点击的根ViewGroupVenueFragment以便它处理点击事件并且它们不会(在 z 顺序意义上)传递给另一个Fragment

于 2014-01-15T15:46:48.290 回答
21

将第二个片段视图的可点击属性设置为 true。

例如:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />
于 2016-07-19T05:06:51.047 回答
7

在 VenueFragment 上设置 onClickListener 将起作用,但我将添加更多解释。让主片段获得触摸事件是为了处理场地片段透明的情况。在这种情况下,期望触摸通过您的透明视图到达下方是合理的。因此,android 会传递触摸事件,直到它们可以被处理。设置一个 onClickListener 将处理该事件,防止它被传递到下一个视图。如果您想“正确”防止点击下部片段,有几个选项:

  1. 在 OnPause 中从主片段中移除 onClickListener,并在 OnResume 中设置它。这样,只要主片段不是活动片段,就无法单击它。
  2. 在 VenueFragment 中子类化您的顶级布局并覆盖 OnTouchEvent 以返回 true。这基本上与设置 onClickListener 做同样的事情,但您可能会发现它使您阻止所有触摸事件的意图更加清晰。
于 2014-01-15T18:52:02.980 回答
3

那么非常快速的答案是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替换为frameLayoutId给定的片段布局

于 2017-04-04T12:13:06.217 回答
0

我有一个更好的解决方案,至少我认为:P。

分片交易时,使用 hide 和 show 方法。

于 2018-05-22T12:18:15.407 回答