ListView в фоновом режиме получает ввод (Fragment API)
Мое приложение основано на макете с вкладками, где каждой вкладке назначается FragmentActivity.
Один из этих видов деятельности имеет следующий макет:
<FrameLayout
android:id="@+id/filialenView"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:layout_height="wrap_content" android:id="@+id/filialList"
android:layout_width="fill_parent"></ListView>
</FrameLayout>
При переключении на эту вкладку создается и отображается список.
Если выбран элемент списка, фрагмент создается и отображается в верхней части списка:
Filiale fragment = new Filiale();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.filialenView, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Макет "filial_detail.xml" для Fragment Filiale выглядит следующим образом
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
... content...
</LinearLayout>
и надувается в onCreateView, как это
View curView = inflater.inflate(R.layout.filial_detail, container, false);
Все работает, как и ожидалось, за исключением того, что после переключения на фрагмент видимый список, по-видимому, сохраняет фокус ввода. Если я коснусь экрана в какой-то "пустой" области, то появится скрытый элемент списка за фрагментом. Также, если я проведу пальцем по экрану, из вывода LogCat можно увидеть, что список прокручивается.
Основываясь на моем понимании FrameLayout, все будет в порядке, чтобы складывать представления как это.
Что не так с этим кодом?
Поскольку пока нет ответа или комментария, более общий вопрос:
Есть ли известная ситуация, когда представление в фоновом режиме должно получать входные данные или это неправильное поведение в любом случае?
1 ответ
Причиной такого поведения является то, что ViewGroups по умолчанию не обрабатывают входные события, а передают их виджетам за ними, если они есть.
В моем данном коде список имеет высоту "wrap_content", таким образом, оставшаяся вертикальная область покрыта только элементом LinearLayout, который передает ввод скрытому фрагменту.
Поведение, которое я хотел, может быть достигнуто
- установка высоты listView равным "fill_parent" или
- добавление OnClickListener в LinearLayout с пустым методом onClick