Фрагмент поверх другого фрагмента

Когда я показываю один фрагмент (полный экран с#77000000 фон) поверх другого фрагмента (давайте назовем его основным), мой основной фрагмент по-прежнему реагирует на щелчки (мы можем нажать кнопку, даже если мы ее не видим).

Question: как предотвратить нажатия на первый (основной) фрагмент?

EDIT

К сожалению, я не могу просто скрыть основной фрагмент, потому что я использую прозрачный фон для второго фрагмента (таким образом, пользователь может видеть, что находится позади).

Ответы на вопрос(10)

Решение довольно простое. В нашем втором фрагменте (который перекрывает наш основной фрагмент) нам просто нужно поймать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;
}

You should hide the first fragment when you are showing the second Fragment if two fragments is placed in same container view.

If you want to know more questions about how to solve problems about Fragment, you can see my library: https://github.com/JustKiddingBaby/FragmentRigger

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

Что вы можете сделать, так это то, что вы можете сделать пустой щелчок для макета предыдущего фрагмента, используя свойство onClick для родительского макета этого основного фрагмента, и в действии вы можете создать функциюdoNothing(View view) и не пиши в нем ничего. Это сделает это за вас.

Задаватьclickable свойство на втором фрагменте для истины. Представление будет перехватывать событие, чтобы оно не передавалось основному фрагменту. Поэтому, если представление второго фрагмента представляет собой компоновку, это будет код:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />

Приемлемый ответ будет «работать», но также приведет к снижению производительности (перерисовка, повторное измерение при изменении ориентации), так как фрагмент внизу все еще рисуется. Может быть, вам нужно просто найти фрагмент по тегу или идентификатору и установить видимость GONE или VISIBLE, когда вам нужно показать снова.

В Котлине:

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

Это решение предпочтительнее альтернативыhide() а такжеshow() методыFragmentTransaction когда вы используете анимацию. Вы просто звоните изonTransitionStart() а такжеonTransitionEnd() изTransition.TransitionListener.

Вам нужно добавитьandroid:focusable="true" сandroid:clickable="true"

Clickable означает, что на него можно нажать указательным устройством или коснуться сенсорного устройства.

Focusable означает, что он может получить фокус от устройства ввода, такого как клавиатура. Устройства ввода, такие как клавиатуры, не могут решить, в какое представление отправлять свои события ввода, основываясь на самих вводах, поэтому они отправляют их в представление, которое имеет фокус.

Добавлениеandroid:clickable="true" не работал для меня. Это решение не работает с CoordinatorLayout, когда он является родительским макетом. Вот почему я сделал RelativeLayout в качестве родительского макета, добавилandroid:clickable="true" к нему и поместил CoordinatorLayout в этот RelativeLayout.

Это звучит как случай для DialogFragment. В противном случае с помощью диспетчера фрагментов один из них будет скрыт, а второй - отображен. Это сработало для меня.

Просто добавь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>

У меня было несколько фрагментов с тем же 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;
    }
}

ВАШ ОТВЕТ НА ВОПРОС