Вопрос по android – Фрагмент поверх другого фрагмента

232

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

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

EDIT

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

@DeeV,onClick Метод ничего не возвращает. Но вы даете идею, спасибо (я скоро опубликую ответ). Dmitry Zaytsev
Не видя, как вы реализуете свой метод onClicked, я угадываю, что вы возвращаете & quot; ложь & quot; при нажатии. DeeV
Исходя из того, что вы дали нам для работы, вы должны попробовать установитьVisibility вашейmain Fragment вGONE когда вы его не используете. adneal
D & APOS; о. Вы правы. OnTouch возвращает его. Хотелось бы мне понять, почему событие касания провалилось во фрагмент. Он не должен этого делать, если вы не публикуете сенсорные события. DeeV
@aneal, отредактировал мой вопрос Dmitry Zaytsev

Ваш Ответ

10   ответов
68

Решение довольно простое. В нашем втором фрагменте (который перекрывает наш основной фрагмент) нам просто нужно поймать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;
}
Android: интерактивный = & Quot; истинно & Quot; на вашем втором макете второго фрагмента.
ваше решение сработало +1 для этого, но вы можете сказать мне, почему мы должны сделать это явно?
Это работает, если пользователь отпустил свой палец
Существует проблема с этим решением, когда вы включаете режим обратной связи доступности, он не будет читать отдельные элементы, вместо этого фокусируется на корневом представлении.
@ Ты не обязан это делать. Это просто еще один способ сделать это (см. Принятый ответ) Dmitry Zaytsev
4

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();
Это должен быть правильный ответ! Спасибо, мужик. Я решил этот вопрос на другом проекте. Но я забыл, как я решил это, и, наконец, я получил ваш ответ. Спасибо.
-1

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

517

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />
У меня такая же проблема с ViewPager. Когда я прокручиваю первую страницу, она также переходит на вторую страницу, и это решение не сработало для меня. Есть идеи?
Почему Android подвергает нас жестким условиям кодирования ?!
Это сработало для меня. Кажется, проще, чем решение @Дмитрий Зайцев дал выше. Есть ли причина, почему это было бы плохой идеей? Я не могу думать ни о ком, но я просто хочу быть уверен.
Это сработало для меня. & Quot; интерактивная & Quot; в Android, видимо, чем-то напоминает iOS & Quot; userInteractionEnabled & Quot;
Это не сработало для меня. у меня естьRelativeLayout внутри фрагмента, и я установил весь вид с помощьюclickeable имущество. Решение @Dmitry решит мою проблему.
0

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

В Котлине:

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

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

1

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

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

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

и focusable = & quot; true & quot; требуется, чтобы избежать предупреждения в новой Android Studio
0

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

0

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

7

Просто добавь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>
Я думаюfocusable="true" Вот только чтобы избежать предупреждения в Android Studio.
Это как-то отличается от принятого ответа?focuseable не действительно необходимо. Dmitry Zaytsev
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;
    }
}

Похожие вопросы