Фокусируемая кнопка в ListView
Для ListView с пользовательским расположением строк, например:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="51dp"
android:layout_height="43dp"
android:id="@+id/btnBin"
android:focusable="false"
android:focusableInTouchMode="false"
android:background="@drawable/ktape" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Temporary"
android:id="@+id/txtShowUsername"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:paddingTop="20dp"
android:gravity="right"
android:paddingRight="10dp" />
</LinearLayout>
кнопка не должна быть фокусируемой, чтобы позволить OnItemClickListener ListView выполнить:
android:focusable="false"
android:focusableInTouchMode="false"
Почему мне нужно установить фокус на false? почему фокусируемая кнопка мешает OnItemClickListener.OnItemClick()
выполнить?
2 ответа
Когда вы касаетесь чего-либо на экране, жест касания становится корневым представлением вашего макета. Затем он передает жест касания своему ребенку один за другим, пока он не будет израсходован. Если дочерний элемент представляет собой интерактивное представление, он использует жест касания и возвращает значение true. Так что жест касания не будет передан в другие виды. Если дочерний элемент не является интерактивным представлением, он просто возвращает false, жест касания будет передан следующим дочерним элементам.
Наконец, если ни одно дочернее представление не использует жест касания, оно будет отправлено обратно самому родителю. Теперь родитель может использовать жест касания, если он есть.
Теперь в вашем случае ListView является родительским, а Button - дочерним. Сначала ListView передает сенсорный жест кнопке. Поскольку кнопка является интерактивным представлением по умолчанию, она использует жест касания, поэтому OnItemClickListener ListView не будет работать. При явной настройке focusable, focusableInTouchMode, который можно щелкнуть как false, кнопка становится неотключаемым представлением. Таким образом, кнопка не использует жест касания, и OnItemClickListener ListView работает.