it-swarm.com.ru

Невидимая раскладка позади фрагмента получает щелчок:

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

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);

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

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

25
Emil Adz

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

33
Emmanuel

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

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

  1. Удалите onClickListener из основного фрагмента в OnPause и установите его в OnResume. Таким образом, каждый раз, когда основной фрагмент не является активным, его нельзя щелкнуть. 
  2. Подкласс вашего макета верхнего уровня в вашем VenueFragment и переопределите OnTouchEvent, чтобы вернуть true. По сути, это будет то же самое, что и установка onClickListener, но вы можете обнаружить, что ваше намерение блокировать все сенсорные события более четко. 
7
GLee

Ну, очень быстрый ответ - 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

1
Rishav Chudal

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

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

0
Code_Life