Подтвердить что ты не робот

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

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

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 идет вверх, и это создает странный опыт.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

  • Удалить onClickListener из основного фрагмента в OnPause и установить его в OnResume. Таким образом, в любой момент, когда основной фрагмент не является активным фрагментом, его нельзя щелкнуть.
  • Подкласс вашего макета верхнего уровня в вашем объекте Fragment и переопределите OnTouchEvent, чтобы вернуть true. Это будет по существу делать то же самое, что установка onClickListener, но вы можете обнаружить, что оно делает ваше намерение блокировать все события прикосновений более ясными.

Ответ 4

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

Ответ 5

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

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