破坏另一个片段问题

Dmi*_*sev 257 android android-fragments

当我#77000000在另一个片段(我们称之为主片段)上显示一个片段(全屏幕为背景)时,我的主片段仍然对点击作出反应(即使我们没有看到它,我们也可以点击一个按钮).

问题:如何防止点击第一(主)片段?

编辑

不幸的是,我不能只隐藏主片段,因为我在第二个片段上使用透明背景(因此,用户可以看到后面的内容).

Jur*_*jak 552

clickable第二个片段视图的属性设置为true.视图将捕获事件,以便它不会传递给主片段.因此,如果第二个片段的视图是布局,那么这将是代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />
Run Code Online (Sandbox Code Playgroud)

  • 为什么Android会让我们遇到苛刻的编码条件?! (13认同)
  • 这对我有用.这似乎比@Dmitry Zaitsev给出的解决方案更容易.有什么理由说这是个坏主意吗?我似乎无法想到,但我只想确定. (4认同)
  • 这对我有用.Android中的"可点击"显然有点像iOS'"userInteractionEnabled" (3认同)
  • 这对我不起作用。我在片段中有一个 `RelativeLayout`,我用 `clickeable` 属性设置了整个视图。@Dmitry 的解决方案解决了我的问题。 (2认同)

Dmi*_*sev 69

解决方案非常简单.在我们的第二个片段(与我们的主片段重叠)中,我们只需要捕获onTouch事件:

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstance){
    View root = somehowCreateView();

    /*here is an implementation*/

    root.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });
    return root;
}
Run Code Online (Sandbox Code Playgroud)


Mir*_*zal 14

只需添加clickable="true"focusable="true"母公司布局

 <android.support.constraint.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:clickable="true"
      android:focusable="true">

      <!--Your views-->

 </android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里的 `focusable="true"` 只是为了避免在 Android Studio 中出现警告。 (2认同)

Jin*_*eoh 6

如果在同一容器视图中放置了两个片段,则在显示第二个片段时应隐藏第一个片段。

如果您想了解有关如何解决Fragment问题的更多问题,可以查看我的库:https : //github.com/JustKiddingBaby/FragmentRigger

FirstFragment firstfragment;
SecondFragment secondFragment;
FragmentManager fm;
FragmentTransaction ft=fm.beginTransaction();
ft.hide(firstfragment);
ft.show(secondFragment);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不是正确的解决方案。片段/活动在视图堆栈中工作。在顶部片段从堆栈中弹出后,您必须再次调用 .show ,这意味着底部片段必须被告知顶部片段已消失。它只是添加了额外的逻辑来维护。 (2认同)

Hos*_*san 6

您需要添加 android:focusable="true"android:clickable="true"

Clickable 意味着它可以被指针设备点击或被触摸设备点击。

Focusable意味着它可以从键盘等输入设备获得焦点。键盘等输入设备无法根据输入本身决定将其输入事件发送到哪个视图,因此它们将它们发送到具有焦点的视图。

  • 并且需要 focusable="true" 以避免在新的 Android Studio 中出现警告 (2认同)