Intereting Posts
Не удается создать проект для приложений google app Какой лучший статический инструмент анализа кода для проекта Android? Оптимизация разработки Eclipse для Android Пользовательская анимация для просмотра Mock Retrofit Наблюдаемый <T> ответ в тестах Android Unit Как отобразить диалоговое окно в android без контекста Activity? Задача Gradle zipAlign не работает? Как бы вы описали текущее состояние платформы Android? В Android SDK внезапно отсутствует папка ant /. Удалил ли Google его? Как вы читаете уникальный идентификатор тега NFC на Android? HttpMessageNotReadableException: не удалось прочитать JSON: непризнанное поле, использующее Spring для Android Изображение, сохраненное на SD-карте, не отображается в приложении «Галерея Android» Android, как установить курсор EditText в конец его текста Сделать фон для изменения кнопки Android при щелчке по XML Есть ли эквивалент «текст клавиатуры ввода для adb shell» для iOS?

Элемент списка с CheckBox не доступен для кликов

У меня есть элемент списка, который содержит CheckBox, и я хочу иметь возможность щелкнуть по CheckBox и самому элементу списка. К сожалению, по-видимому, существует какой-то конфликт между ними, поскольку я могу только щелкнуть по элементу, когда комментирую CheckBox. Кажется, я помню, что был способ исправить это, но я не могу найти его в данный момент. благодаря

EDIT: это с ListFragment, поэтому нет необходимости вызывать setOnItemClickListener.

ОК, вот XML для элемента списка. Проблема в том, что CheckBox, но я решил, возможно, также скопировать все.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item_survey" android:layout_width="fill_parent" android:layout_height="wrap_content" style="@style/SimpleListItem"> <TextView android:id="@+id/survey_title" android:layout_width="fill_parent" android:layout_height="wrap_content" style="@style/ListItemTitle" /> <TextView android:id="@+id/survey_date" android:layout_below="@id/survey_title" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/ListItemSubtitle" /> <TextView android:id="@+id/survey_completed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@id/survey_title" android:textColor="@color/accent_1" android:text="@string/survey_completed" style="@style/ListItemSubtitle" /> <CheckBox android:id="@+id/survey_did_not_attend" android:layout_below="@id/survey_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/survey_did_not_attend" android:focusable="false" style="@style/ListItemSubtitle" /> </RelativeLayout> 

Solutions Collecting From Web of "Элемент списка с CheckBox не доступен для кликов"

Вам нужно добавить это в свой собственный XML-файл xml-файла : descendantFocusability = "blocksDescendants"

Вставьте это в корневой элемент XML-файла строки строки item

 android:descendantFocusability="blocksDescendants" 

Как описано здесь и здесь , это либо известная проблема, либо работает так, как она была разработана. Если в элементе списка есть элементы с кликабельными или фокусируемыми элементами, сам элемент списка не может быть доступен для кликов. Ромен Гай говорит: «Это работает так, чтобы поддерживать навигацию по трекболу / плану».

Это сделало для меня работу

 <CheckBox ... android:focusable="false" android:clickable="false" android:focusableInTouchMode="false" /> 

Я решил проблему таким образом. Я реализовал OnClickListener внутри адаптера, а не в Fragment / Activity, и он работает хорошо. Теперь я могу использовать ListView с флажками и нажимать на оба. Вот мой код:

 public class MyFragment extends Fragment { ... private void setView() { ListView listView = (ListView) mRootView.findViewById(R.id.listview); mItems = DatabaseManager.getManager().getItems(); // create adapter if(listView.getAdapter()==null) { MyAdapter adapter = new MyAdapter(this, mItems); try { listView.setAdapter(adapter); } catch(Exception e) { e.printStackTrace(); return; } } else { try { ((MyAdapter) listView.getAdapter()).refill(mItems); BaseAdapter adapter = (BaseAdapter) listView.getAdapter(); listView.requestLayout(); adapter.notifyDataSetChanged(); } catch(Exception e) { e.printStackTrace(); return; } } // handle listview item click listView.setClickable(true); // listView.setOnItemClickListener(...); // this method does not work in our case, so we can handle that in adapter } ... } public class MyAdapter extends BaseAdapter { ... @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater inflater = (LayoutInflater) mFragment.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.listview_item, null); } ... // handle listview item click // this method works pretty well also with checkboxes view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // do something here // for communication with Fragment/Activity, you can use your own listener } }); return view; } ... } 

Вы пробовали настройку

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

?

Это сработало для меня.

С помощью android: descendantFocusability = "blocksDescendants" его рабочий тон

Ok .. Сделайте экземпляр CheckBox Like

 CheckBox check; check = (CheckBox) myView.findViewById(R.id.check); check.setOnClickListener(new CheckBoxSelect(position)); 

onItemClickListener выше код в onItemClickListener или в Adapter вы используете. Теперь сделайте класс, как показано ниже

 private class CheckBoxSelect implements OnClickListener { int pos; String str; public CheckBoxSelect(int position) { pos = position; } public void onClick(View v) { } } 

Выполнять любые функции в onClick .

Позднее, но тем не менее решение для всех тех, кто все еще нуждается в этом.

Это правда, что встроенный механизм, используя:

 final ArrayAdapter<String> adapter = new ArrayAdapter<String>( getActivity(), android.R.layout.simple_list_item_multiple_choice, lst); 

Не позволяет обоим, т.е. нажмите на флажок И нажмите на элемент списка. Где бы вы ни нажимали, флажок захватывает событие.

Однако, если вы создаете свой собственный ArrayAdapter с помощью getView как это, то он отлично работает:

  @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.list_item_ecu_fehler, null); } v.setFocusable(true); v.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (DEBUG) Log.i(this.getClass().getSimpleName(), " ->>" + Thread.currentThread().getStackTrace()[2] .getMethodName()); } }); CheckBox selectedForClearingCB = (CheckBox) v .findViewById(R.id.checkBox); if (selectedForClearingCB != null) { selectedForClearingCB.setTag(position); //so we know position in the list selectedForClearingCB.setChecked(true); selectedForClearingCB.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (((CheckBox) v).isChecked()) { if (DEBUG) Log.i(this.getClass().getSimpleName(), " -> CB checked: " + Integer.toString((Integer) v .getTag())); } } }); } } return v; } }