Щелкает невидимый макет за фрагментом:

Я создал несколько фрагментов и добавляю первый фрагмент следующим образом:

mainFragment = (MainFragment) MainFragment.create();
    getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    .add(R.id.content, mainFragment, MAIN_FRAGMENT_TAG)
    .commit();

Второй фрагмент добавляется так:

     getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    //.hide(mainFragment)
    .add(R.id.content,VenueFragment.create(vid), "Venue Fragment")
    .addToBackStack(null)
    .commit();
    setDrawerIndicatorEnabled(false);

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

Если я использую опцию скрытия, этого не происходит, но по какой-то причине анимация для удаления MainFragment увеличивается, и это вызывает странные ощущения.


person Emil Adz    schedule 15.01.2014    source источник
comment
Установите для свойства clickable в представлении второго фрагмента значение true. ‹LinearLayout xmlns: android = schemas.android.com/apk/res/android android : layout_width = fill_parent android: layout_height = fill_parent android: clickable = true / ›   -  person faiziii    schedule 04.11.2014
comment
@faiziii, если вы посмотрите внимательно, то заметите, что это именно то, что указано в принятом ответе.   -  person Emil Adz    schedule 04.11.2014


Ответы (5)


Вам нужно сделать корень ViewGroup VenueFragment кликабельным, чтобы он обрабатывал события щелчка, и они не передавались (в смысле z-порядка) другому Fragment.

person Emmanuel    schedule 15.01.2014
comment
вы имеете в виду, что во втором фрагменте я добавил VenueFragment? - person Emil Adz; 15.01.2014
comment
Хорошо, но даже если это сработает, это похоже на работу. Не то, что Google намеревался сделать таким образом или чтобы с ним обращались подобным образом. Есть ли другой способ справиться с этой проблемой? - person Emil Adz; 15.01.2014
comment
Я не знаю. Я столкнулся с той же проблемой, и это было единственное решение, которое я нашел. Должен быть другой способ. - person Emmanuel; 15.01.2014
comment
Что ж, теперь мы знаем, почему это происходит, что теперь действительно имеет смысл. И ваш ответ был самым простым. Тогда спасибо. - person Emil Adz; 16.01.2014
comment
ну, я должен признать, что моя первоначальная мысль была лол, черт возьми, чувак, когда я увидел твое решение ... но оно просто РАБОТАЕТ! Спасибо. - person Karoly; 21.06.2017
comment
Я понимаю логику в этом, и если он все еще активен, я хотел бы знать, что, если в макете (ViewGroup) есть интерактивный текст, который был сделан интерактивным, как мы с этим справимся? - person bvsss; 05.12.2017

Установите для свойства 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" />
person Digvijay Machale    schedule 19.07.2016

Настройка onClickListener на VenueFragment будет работать, но я добавлю немного дополнительных пояснений. Событие касания основного фрагмента предназначено для обработки случая, когда фрагмент вашего места проведения является прозрачным. В этом случае было бы разумно ожидать, что прикосновение пройдет через ваш прозрачный вид к тому, что внизу. Таким образом, Android передает события касания до тех пор, пока они не будут обработаны. Установка onClickListener будет обрабатывать событие, предотвращая его передачу в следующий просмотр. Если вы хотите "правильно" предотвращать клики по нижнему фрагменту, есть несколько вариантов:

  1. Удалите onClickListener из основного фрагмента в OnPause и установите его в OnResume. Таким образом, всякий раз, когда основной фрагмент не является активным, щелкнуть по нему нельзя.
  2. Создайте подкласс макета верхнего уровня в VenueFragment и переопределите OnTouchEvent, чтобы вернуть true. По сути, это будет делать то же самое, что и установка onClickListener, но вы можете обнаружить, что это делает ваше намерение более четким блокировать все события касания.
person GLee    schedule 15.01.2014
comment
Спасибо за объяснение и +1 за это, но по правде говоря, вариант, который я получил в первом ответе, работает и в основном делает то же, что и ваш второй вариант для исправления этого. Только без беспорядка наследования и последующего использования этого настраиваемого класса в макете. - person Emil Adz; 16.01.2014

Что ж, очень быстрый ответ - android:clickable="true" в верхней части свойств макета во фрагменте.

Но было бы лучше, если бы вы создали действие с FrameLayout и его id, а не другими элементами в этом действии < / сильный>. Поэтому всякий раз, когда вы хотите, чтобы на экране отображался фрагмент, вызовите это действие и используйте

getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
    .replace(R.id.frameLayoutId, mainFragment, MAIN_FRAGMENT_TAG)
    .commit();

используйте replace вместо add, чтобы frameLayout действия заменяется макетом фрагмента, заданным в frameLayoutId

person Rishav Chudal    schedule 04.04.2017

У меня есть лучшее решение, по крайней мере, то, что я думаю: P.

при фрагментированной транзакции используйте метод скрытия и отображения.

person Code_Life    schedule 22.05.2018
comment
Это не лучшее решение, потому что иногда вы хотите оставить задний фрагмент (например, когда верхний фрагмент не является полноэкранным). в этом случае нужно оставить оба фрагмента. что бы ты сделал тогда? - person Emil Adz; 22.05.2018