Я задал этот вопрос 6 лет назад. Тем временем лучшие практики разработки для Android изменились, и я стал лучшим разработчиком.
С тех пор я понял, что использование XML-атрибута onClick
является плохой практикой, и удалил его из любой базы кода, над которой я работаю.
Все мои обработчики кликов теперь определены в коде приложения, а не в макетах XML!
Мои причины никогда не использовать onClick
заключаются в следующем:
onClick
, что затем приведет к ошибке во время выполнения. ошибкаonClick
смешивает их, что плохо!Надеюсь, я убедил вас никогда не использовать onClick
в макете :) !
Ниже приведен мой первоначальный вопрос, который является довольно хорошей иллюстрацией того, почему использование onClick
— плохая идея.
===
Я определяю пункты меню в XML и пытаюсь использовать атрибут onClick, добавленный в API 11. Когда действие запускается в эмуляторе под управлением 4.0.3 возникают следующие исключения:
FATAL EXCEPTION: main
android.view.InflateException: Couldn't resolve menu item onClick handler
onFeedbackMenu in class android.view.ContextThemeWrapper
...
Caused by: java.lang.NoSuchMethodException: onFeedbackMenu
[interface com.actionbarsherlock.view.MenuItem]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
Я не понимаю, что вызывает исключение, поскольку в моем действии определен следующий метод
import com.actionbarsherlock.view.MenuItem;
...
public void onFeedbackMenu( MenuItem menuItem ) {
Toast.makeText( this, "onFeedBack", Toast.LENGTH_LONG ).show();
}
Мой файл определения меню XML содержит:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
...
<item
android:id="@+id/menu_feedback"
android:icon="@drawable/ic_action_share"
android:showAsAction="ifRoom"
android:title="@string/menu_feedback"
android:onClick="onFeedbackMenu" />
</menu>
Для обратной совместимости я использую ActionBarSherlock , а также получаю очень похожее исключение при запуске приложения на 2.3.x.
Это более полная версия трассировки стека
FATAL EXCEPTION: main
android.view.InflateException: Couldn't resolve menu item onClick handler
onFeedbackMenu in class android.view.ContextThemeWrapper
at com.actionbarsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:204)
at com.actionbarsherlock.view.MenuInflater$MenuState.setItem(MenuInflater.java:410)
at com.actionbarsherlock.view.MenuInflater$MenuState.addItem(MenuInflater.java:445)
at com.actionbarsherlock.view.MenuInflater.parseMenu(MenuInflater.java:175)
at com.actionbarsherlock.view.MenuInflater.inflate(MenuInflater.java:97)
...
Caused by: java.lang.NoSuchMethodException: onFeedbackMenu
[interface com.actionbarsherlock.view.MenuItem]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getMethod(Class.java:915)
at com.actionbarsherlock.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:202)
... 23 more