2013-09-19 2 views
7

В настоящее время у меня есть строка ListView. Щелчок по любой области в строке даст ListView событий кликов.Строка ListView не может быть нажата после добавления кнопки в строку

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { 
     this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
     this.getListView().setMultiChoiceModeListener(new ModeCallback()); 
     this.getListView().setOnItemClickListener(new ListViewOnItemClickListener()); 
    } else { 
     // http://stackoverflow.com/questions/9754170/listview-selection-remains-persistent-after-exiting-choice-mode 
     this.getListView().setOnItemLongClickListener(new ListViewOnItemLongClickListener()); 
     this.getListView().setOnItemClickListener(new ListViewOnItemClickListener()); 
    } 

Теперь, для каждой строки, я хотел бы добавить небольшую кнопку. Нажатие на маленькую кнопку даст событие нажатия кнопки, отличное от ListView оригинального события кликов.

enter image description here

В моей ArrayAdapter, я использую, чтобы иметь

public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 

    if (rowView == null) { 
     LayoutInflater inflater = activity.getLayoutInflater(); 
     rowView = inflater.inflate(R.layout.watchlist_row_layout, null); 
     ... 
    } 

    Button button = (Button)rowView.findViewById(R.id.button1); 
    button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Utils.showLongToast("BUTTON CLICK"); 
     } 
    }); 

enter image description here

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

Могу ли я узнать, почему это так? Есть ли способ разрешить это?

ответ

14

Если вы хотите сделать как строки и кнопки интерактивными установите

android:focusable="false" 

для Баттона. То же самое касается ImageButtons, RadioButtons, ...

Android был разработан в основном для большого набора методов ввода. Вся система полностью работоспособна без касания экрана . Чтобы перемещаться по пользовательскому интерфейсу, пользователь может использовать направленную площадку , которая фокусирует представления после просмотров тогда и только тогда, когда эти Представления являются focusable. По умолчанию все элементы управления Android настраиваются. Для того, чтобы не мог контролировать элементы управления, недоступные для фокусировки, ListView просто предотвратит выбор (и щелчок) элемента itemview. В design, ListView блокирует клики itemview, содержащие хотя бы один сфокусированный потомок, но он не делает контент доступным для достижения цели вызов setItemsCanFocus (true).

Здесь все большие объяснения: Having several clickable areas in a ListView

+0

Удивительно, вы спасли мою жизнь :) –

0

Стоит отметить, что предпочтительный способ (даже по ссылке, указанной в принятом ответе), чтобы установить андроид: атрибут descendantFocusability блокировать фокус от корневого макета, который вы раздуваете внутри адаптера. Могут быть потенциальные ситуации, когда просто установка атрибута focusable на false для отдельного элемента не решит проблему, но атрибут descendantFocusability будет.

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