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; } } }); 

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

Intereting Posts
Android: как избежать компоновки при нажатии клавиатуры Отказался от загрузки сценария, поскольку он нарушает следующую политику политики безопасности контента Как получать уведомления о каждом новом изображении, видимом в приложении галереи? До того, как менеджер загрузки Android получит статус загрузки, скачав ссылку Id? Как добавить TextView и EditText, используя программный AlertDialog по умолчанию Могу ли я использовать внешнюю SD-карту ext2 или ext3 в Android 2.1 Android прозрачный ActionBar с ActionSherlock на v19 Пользовательский Spinner не скрывает выпадающее меню после выбора Дублирование строк списка в фрагменте списка при изменении ориентации Как мы отличаемся от требований, не требующих ответа, в разрешениях Runtime Android M? Android: управление URL-адресом другого сервера для разработки и выпуска Есть ли событие установки в android? Как я могу избавиться от прозрачного фонового пространства в (Android Asset Studio – Icon Generator)? Android: mediaplayer ушел с необработанными событиями Регистратор Android для мобильного телефона для gcm