片段后面的不可见布局被点击:

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。

片段交易时,使用隐藏和显示方法。

【讨论】:

这不是一个更好的解决方案,因为有时你想留下后面的片段(例如:当顶部片段不是全屏片段时)。在这种情况下,您需要留下两个片段。那你会怎么做?

以上是关于片段后面的不可见布局被点击:的主要内容,如果未能解决你的问题,请参考以下文章

方向更改时不可见的片段

显示/隐藏片段并以编程方式更改可见性属性

Android片段中的问题:仍然单击上一个片段

替换的片段在背景上仍然可见

替换的片段仍然可见

片段中的按钮自定义视图