破坏另一个片段问题

时间:2012-04-30 19:45:17

标签: android android-fragments

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

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

修改

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

12 个答案:

答案 0 :(得分:530)

将第二个片段视图上的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" />

答案 1 :(得分: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;
}

答案 2 :(得分:10)

只需将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>

答案 3 :(得分:4)

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

  

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

FirstFragment firstfragment;
SecondFragment secondFragment;
FragmentManager fm;
FragmentTransaction ft=fm.beginTransaction();
ft.hide(firstfragment);
ft.show(secondFragment);
ft.commit();

答案 4 :(得分:3)

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

Clickable表示可以通过指针设备单击它或通过触摸设备点击它。

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

答案 5 :(得分:2)

方法1:

您可以添加到所有片段布局

android:clickable="true"
android:focusable="true"
android:background="@color/windowBackground"

方法2 :(以编程方式)

扩展FragmentBase等的所有片段,然后将此代码添加到FragmentBase

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    getView().setBackgroundColor(getResources().getColor(R.color.windowBackground));
    getView().setClickable(true);
    getView().setFocusable(true);
}

答案 6 :(得分:2)

我们中的一些人为此线程提供了不止一种解决方案,但我还要提及另一种解决方案。如果您不愿意,那么像我一样,将clickable和focusable等同于XML中每个布局的根ViewGroup。如果您有一个像下面这样的东西,也可以将它放在您的基础上;

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ) : View? {
        super.onCreateView(inflater, container, savedInstanceState)

        val rootView = inflater.inflate(layout, container, false).apply {
            isClickable = true
            isFocusable = true
        }

        return rootView
    }

您也可以使用内联变量,但出于个人原因我不喜欢它。

我希望它对那些讨厌布局XML的人有所帮助。

答案 7 :(得分:0)

你可以做的是你可以使用onClick属性对该主片段的父布局进行空白点击前一个片段的布局,在活动中你可以创建一个函数doNothing(View view)并且不要在其中写入任何内容。这将为你做到。

答案 8 :(得分:0)

这听起来像DialogFragment的情况。否则,使用Fragment Manager提交一个隐藏,另一个显示。这对我有用。

答案 9 :(得分:0)

添加android:clickable="true"对我不起作用。当它是父布局时,此解决方案不适用于CoordinatorLayout。这就是为什么我将RelativeLayout作为父布局,将android:clickable="true"添加到它并将CoordinatorLayout放在此RelativeLayout上。

答案 10 :(得分:0)

可接受的答案将“起作用”,但由于仍在绘制底部的片段,因此还会导致性能成本(透支,重新测量方向改变)。也许您只需要按标签或ID查找片段,然后在需要再次显示时将可见性设置为GONE或VISIBLE。

在科特林:

fragmentManager.findFragmentByTag(BottomFragment.TAG).view.visibility = GONE

使用动画时,此解决方案优于hide()的{​​{1}}和show()的替代方法。您只需从FragmentTransaction的{​​{1}}和onTransitionStart()中调用它即可。

答案 11 :(得分:0)

我有多个具有相同xml的片段。
花了几个小时后,我删除了setPageTransformer,它开始起作用

   //  viewpager.setPageTransformer(false, new BackgPageTransformer())

我有缩放逻辑。

public class BackgPageTransformer extends BaseTransformer {

    private static final float MIN_SCALE = 0.75f;

    @Override
    protected void onTransform(View view, float position) {
        //view.setScaleX Y
    }

    @Override
    protected boolean isPagingEnabled() {
        return true;
    }
}