нажатие на фрагмент вызывает активность позади него - PullRequest
13 голосов
/ 08 февраля 2012

Я предполагаю, что это что-то действительно простое, может быть, настройка в виде списка или фрагмент.Но я не мог найти решение для этого в течение нескольких часов.Итак ... У меня есть listView, как это

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:isScrollContainer="true">

<ListView 
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#fffafa"
    />

</RelativeLayout>

, когда кто-то нажимает на элемент списка.Я заменяю его следующим фрагментом

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.content, newFragment);

    ft.addToBackStack(null);
    ft.commit();

. Если щелкнуть элемент списка, весь список заменяется фрагментом (*), состоящим из кнопки и пары текстовых полей.Фрагмент надлежащим образом заменяет listView информацией об элементе.Когда я нажимаю назад, он корректно возвращает представление списка.

Проблема в том, что, если я нажимаю на фон *, он ведет себя так, как будто я нажимаю на список, который находится позади него ... и приноситфрагмент об этом предмете на фронт.Я могу бесконечно нажимать на фон, чтобы принести другие фрагменты.Я могу вернуться к списку, нажав назад, назад ..

Почему этот фрагмент прозрачен?как я могу это исправить?

Ответы [ 4 ]

16 голосов
/ 28 января 2016

Я решил похожую проблему, добавив android:clickable="true" в элемент, который вел себя так, как будто он был «прозрачным». Сделав его кликабельным, он должен был обрабатывать события кликов, а не передавать их в представленные ниже виды.

6 голосов
/ 08 февраля 2012

Я считаю, что проблема в том, что метод replace не заменяет ListView. Он заменяет только другие фрагменты, которые находятся внутри контейнера. В этом конкретном случае их нет. Таким образом, вы по существу добавляете свой фрагмент поверх ListView, потому что RelativeLayout позволяет представлениям находиться друг над другом. Когда вы нажимаете на фрагмент, вы не полностью обрабатываете его, поэтому он переходит к базовому представлению, которое является ListView.

Простое, быстрое и грязное решение состоит в том, чтобы извлечь объект ListView и либо удалить его из контейнера самостоятельно, либо установить его видимость на GONE. Лучшим решением было бы использовать ListFragment , который должен показывать ожидаемые результаты.

3 голосов
/ 21 июня 2017

Итак, у меня была точно такая же проблема, я до сих пор не знаю, почему, но убедитесь, что вы добавили android: clickable = "true" в roovView макета вашего второго фрагмента.

примерно так:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:clickable="true"
android:orientation="vertical">
.....any content for your item (2nd fragment).....
</LinearLayout>
3 голосов
/ 21 февраля 2017

Установите для свойства clickable значение true, чтобы событие click использовалось только для фрагмента переднего плана.

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />
...