2016-05-02 2 views
0

Для ListView с макетом пользовательских строк, как это:Focusable Кнопки в 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> 

кнопка не должен быть фокусируемой позволить управлению ListView OnItemClickListener выполнить:

android:focusable="false" 
    android:focusableInTouchMode="false" 

Почему мне нужно установить фокусом к ложному? почему фокусируемая кнопка предотвращает выполнение OnItemClickListener.OnItemClick()?

+0

Что происходит? это рабочий элемент прослушивателя? – Raghunandan

+0

@Raghunandan, я хочу знать, почему мне нужно установить фокусное значение на false. – Alireza

+0

Вы можете посмотреть исходный код и узнать, почему его часть – Raghunandan

ответ

0

Попробуйте добавить эту строку:

android:clickable="false" 
+0

Этот код работает, я хочу знать, почему мне нужно настроить focusable на false. – Alireza

+0

Я не уверен, но я думаю, что если вы не нажмете кнопку, когда focusable будет правдой, а щелчок будет ложным, ничего не произойдет (даже не из списка). –

+0

Да, это правда. Но я хочу знать, почему? – Alireza

1

Когда вы касаетесь что-то на экране, сенсорный жест получить корневой зрения макета. Затем он передает жест касания к своему ребенку один за другим, пока он не будет потреблен. Если ребенок является кликабельным видом, он потребляет жест касания и возвращает true. Чтобы сенсорный жест не передавался другим представлениям. Если ребенок не является кликабельным представлением, он просто возвращает false, сенсорный жест будет передан следующим детям.

Наконец, если ни один детский вид не использует сенсорный жест, он будет отправлен обратно самому родителю. Теперь родитель может использовать жест касания, если он есть.

Теперь в вашем случае ListView является родительским, а Button - дочерним. Сначала ListView передает сенсорный жест кнопке. Так как кнопка является кликабельным представлением по умолчанию, она потребляет сенсорный жест, поэтому OnItemClickListener ListView не будет работать. Явным образом настраивая фокусируемый, focusableInTouchMode, кликабельно как false, кнопка становится неаккуратной. Таким образом, кнопка не будет потреблять сенсорный жест, а работает OnItemClickListener ListView.

+0

Спасибо за ответ. Вы знаете, установив focusable на false, у меня есть функция clickListener для кнопки и itemClickListener для элементов списка, и она работает хорошо. Короче говоря, кнопка все еще доступна для кликов. – Alireza

+0

В идеале, когда вы нажимаете на кнопку, кнопка ClickListener будет работать, и OnItemClickListener ListView не будет запускаться. Когда вы нажимаете на элемент ListView (не на кнопке), ListView OnItemClickListener будет работать, а ClickListener Button не будет запускаться. – Bob

+0

Я думаю, вместо android: focusable = "false", вы должны добавить атрибут android: descendantFocusability = "blocksDescendants" в корневую компоновку элемента ListView. http://developer.android.com/reference/android/view/ViewGroup.html#attr_android%3adescendantFocusability – Bob

Смежные вопросы