Когда я показываю один фрагмент (который является полноэкранным с #77000000
фоном) поверх другого фрагмента (давайте назовем его основным), мой основной фрагмент по-прежнему реагирует на щелчки (мы можем нажать кнопку, даже если мы ее не видим).
Вопрос : как предотвратить нажатия на первый (основной) фрагмент?
РЕДАКТИРОВАТЬ
К сожалению, я не могу просто скрыть основной фрагмент, потому что я использую прозрачный фон для второго фрагмента (поэтому пользователь может видеть, что находится позади).
android
android-fragments
Дмитрий Зайцев
источник
источник
Visibility
из ваших ,main
Fragment
чтобы ,GONE
когда вы его не используете.onClick
метод ничего не возвращает. Но вы даете идею, спасибо (я скоро отправлю ответ).Ответы:
Установите для
clickable
свойства второго фрагмента значение true. Представление будет перехватывать событие, чтобы оно не передавалось основному фрагменту. Так что, если представление второго фрагмента является макетом, это будет код:источник
RelativeLayout
фрагмент внутри, и я установил весь вид с помощьюclickeable
свойства. Решение @Dmitry решит мою проблему.Решение довольно простое. Во втором фрагменте (который перекрывает наш основной фрагмент) нам просто нужно перехватить
onTouch
событие:источник
Просто добавьте
clickable="true"
иfocusable="true"
родительский макетЕсли вы используете
AndroidX
, попробуйте этоисточник
focuseable
не действительно необходимо.focusable="true"
здесь только для того, чтобы избежать предупреждения в Android Studio.Вы должны скрывать первый фрагмент, когда вы показываете второй фрагмент, если два фрагмента размещены в одном и том же виде контейнера.
источник
Вы должны добавить
android:focusable="true"
сandroid:clickable="true"
Clickable
означает, что на него можно нажать указательным устройством или коснуться сенсорного устройства.Focusable
означает, что он может получить фокус от устройства ввода, например клавиатуры. Устройства ввода, такие как клавиатуры, не могут решить, в какое представление отправлять свои события ввода, основываясь на самих вводах, поэтому они отправляют их в представление, которое имеет фокус.источник
Существует несколько решений, которые некоторые из нас внесли в этот поток, но я также хотел бы упомянуть еще одно решение. Если вам не нравится помещать кликабельный и фокусируемый, равный true для каждой корневой макета макета в XML, как я. Вы также можете положить его на свою базу, если у вас есть так же, как показано ниже;
Я надеюсь, что это поможет тем, кто ненавидит макет XML.
источник
Приемлемый ответ будет «работать», но также приведет к снижению производительности (перерисовка, повторное измерение при изменении ориентации), так как фрагмент внизу все еще рисуется. Может быть, вам нужно просто найти фрагмент по тегу или идентификатору и установить видимость GONE или VISIBLE, когда вам нужно снова показать.
В Котлине:
Такое решение предпочтительнее альтернативы
hide()
иshow()
методовFragmentTransaction
использования анимации. Вы просто вызовите его изonTransitionStart()
иonTransitionEnd()
вTransition.TransitionListener
.источник
Метод 1:
Вы можете добавить ко всем фрагментам макет
Метод 2: (программно)
Расширить весь фрагмент
FragmentBase
и т. Д. Затем добавьте этот код вFragmentBase
источник
Что вы можете сделать, так это то, что вы можете сделать пустой щелчок для макета предыдущего фрагмента, используя свойство onClick для родительского макета этого основного фрагмента, и в действии вы можете создать функцию
doNothing(View view)
и ничего не писать в ней. Это сделает это за вас.источник
Это звучит как случай для DialogFragment. В противном случае с помощью диспетчера фрагментов один скрыть, а второй отобразить. Это сработало для меня.
источник
Добавление
android:clickable="true"
не работает для меня. Это решение не работает на CoordinatorLayout, когда это родительский макет. Вот почему я сделал RelativeLayout в качестве родительского макета, добавилandroid:clickable="true"
к нему и поместил CoordinatorLayout в этот RelativeLayout.источник
У меня было несколько фрагментов с тем же XML.
Потратив часы я снял
setPageTransformer
и все заработалоУ меня была отвратительная логика.
источник