Щелчок по фрагменту вызывает активность за ним

Я предполагаю, что это что-то действительно простое, может быть, настройка в списке или фрагменте. Но я не мог найти решение для него пару часов. Итак, у меня есть 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 информацией об элементе. Когда я нажимаю назад, он правильно возвращает список.

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

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

Solutions Collecting From Web of "Щелчок по фрагменту вызывает активность за ним"

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

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

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

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

Итак, у меня была точно такая же проблема, я до сих пор не знаю причины, но убедитесь, что вы добавили андроид: 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>