Intereting Posts
Разработка приложения для правостороннего Android «Код ошибки 5: база данных заблокирована» при использовании ContentProvider Предоставить разрешение на работу в AndroidManifest Android ConnectivityManager не видит разрешения ACCESS_NETWORK_STATE Форматирование адресов на основе языка в андроиде Как указать порядок сортировки запроса поставщику контента Получить координаты холста после масштабирования вверх / вниз или перетаскивания в андроид Примеры использования CastCompanionLibrary для простого отображения изображения После onLongPress первый вид в gridview получает NullPointerException в startDrag Кодер и декодер Base64 Меню параметров – удаление фокуса с элемента Kotlin: Можем ли мы использовать @Subscribe EventBus (GreenRobot) в Котлине? Автоматически отправлять электронную почту Отображение главного меню / главного экрана приложения при возврате в приложение после запуска внешней активности / намерения Кто-нибудь знает значение результата команды «top» в android?

OnClickListener не работает с атрибутом clickable

Итак, моя проблема в том, что OnClickListener не работает, когда я устанавливаю android:clickable="true" в мой класс.

Это код MyClass xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/background" android:clickable="true"> ... ... </RelativeLayout> 

MyClass.java:

 public class MyClass extends RelativeLayout implements OnClickListener { public MyClass(Context context) { super(context); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.book_item, this); setOnClickListener(this); } public void onClick(View v) { Log.v("TAG", "Hello"); } ... ... } 

Он отлично работает, когда я устанавливаю android:clickable to false. Что я не так?

Установка OnClickListener автоматически установит для свойства clickable значение true. Однако код, который вы показываете, запутан. Я понимаю, что ваше представление MyClass является родительским элементом RelativeLayout отображаемым в XML-файле.

Если это так, дочерний RelativeLayout сначала получит сенсорные события (поскольку он доступен для кликов), но ничего не сделает с ними, так как у него нет слушателя кликов.

Просто удалите clickable=true из вашего XML.

Когда вы это сделаете: android:clickable="true" вы отключите onClickListener (это не логично, но вот так ..).

Поэтому установите значение "false" или просто удалите эту строку из вашего XML-файла;)

Добавьте идентификатор в свой макет:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/yourId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/background" android:clickable="true"> </RelativeLayout> 

Затем в java-коде:

 public class MyClass extends RelativeLayout implements OnClickListener { public MyClass(Context context) { super(context); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.book_item, this); findViewById(R.id.yourId).setOnClickListener(this); } public void onClick(View v) { Log.v("TAG", "Hello"); } ... ... } 
  ((RelativeLayout)findViewById(R.id.yourId)).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { //code area ... Log.v("TAG", "Hello"); return true; } else{ return false; } } }); 

Вы также можете использовать этот способ.