Фрагмент над другим фрагментом

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

Вопрос: как предотвратить щелчки на первом (основном) фрагменте?

РЕДАКТИРОВАТЬ

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

Ответ 1

Установите свойство 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" />

Ответ 2

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

Ответ 3

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

Если вы используете AndroidX, попробуйте это

 <androidx.constraintlayout.widget.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-->

 </androidx.constraintlayout.widget.ConstraintLayout>

Ответ 4

Вы должны скрывать первый фрагмент при показе второго фрагмента, если два фрагмента размещены в одном и том же виде контейнера.

Если вы хотите узнать больше вопросов о том, как решить проблемы с фрагментом, вы можете просмотреть мою библиотеку: https://github.com/JustKiddingBaby/FragmentRigger

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

В Котлине:

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

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

Ответ 10

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

Ответ 11

Лучший способ - использовать FrameLayout, я использую его для фрагмента, поэтому нет необходимости объявлять фрагменты в другом Xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@color/colorPrimary"
    tools:context="com.example.sumedh.fragmentpractice1.MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_gravity="center"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:id="@+id/BtnNext"/>
</FrameLayout>