Ответ 1
Вам нужно сделать root ViewGroup
из VenueFragment
доступным для кликов, чтобы он обрабатывал события кликов, и они не пропускают (в смысле z-порядка) к другому Fragment
.
Я создал несколько фрагментов, и я добавлю первый фрагмент следующим образом:
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
clickable views. Как я могу предотвратить это?
Если я использую опцию hide, тогда это не происходит, но по какой-то причине анимация для удаления MainFragment
идет вверх, и это создает странный опыт.
Вам нужно сделать root ViewGroup
из VenueFragment
доступным для кликов, чтобы он обрабатывал события кликов, и они не пропускают (в смысле z-порядка) к другому Fragment
.
Установите свойство 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" />
Настройка onClickListener на VenueFragment будет работать, но я добавлю немного больше объяснений. Наличие основного фрагмента для получения события касания подразумевает поведение, чтобы обработать случай, когда фрагмент вашего места прозрачен. В этом случае было бы разумно ожидать, что прикосновение пройдет через ваш прозрачный вид к тому, что находится внизу. Таким образом, андроид передает события касания, пока они не будут обработаны. Установка onClickListener будет обрабатывать событие, не позволяя ему перейти к следующему представлению. Если вы хотите быть "правильным" о предотвращении кликов на нижнем фрагменте, есть несколько вариантов:
Ну, очень быстрый ответ 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();
используйте заменить вместо добавить, чтобы frameLayout из активности был заменен макетом фрагмента как заданный frameLayoutId
У меня есть лучшее решение, по крайней мере, то, что я думаю: P.
во время транзакции фрагмента используйте метод скрытия и показа.