【发布时间】:2012-06-30 01:02:16
【问题描述】:
我在 6 年前问过这个问题。与此同时,Android 开发的最佳实践发生了变化,我已经成为了一名更好的开发人员。
从那时起,我意识到使用onClick XML 属性是一种不好的做法,并已将其从我工作的任何代码库中删除。
我的所有点击处理程序现在都在应用程序的代码中定义,而不是 XML 布局!
我从不使用onClick的原因是
-
onClickXML 属性的值很容易出错,从而导致运行时错误 - 开发人员可能会重构点击处理程序方法的名称,而没有意识到它是从布局中调用的(参见原因 1)
- 找出实际调用的方法并不总是显而易见的。特别是如果布局正在被 Fragment 使用时
- 将布局与行为的关注点分开是好的。使用
onClick会混淆它们,这很糟糕!
我希望我已经说服你不要在布局中使用onClick :)!
以下是我最初的问题,很好地说明了为什么使用onClick 是一个坏主意。
===
我在 XML 中定义菜单项,并尝试使用在 API 11 中添加的 onClick 属性。在运行 4.0.3 的模拟器中启动 Activity 时,会发生以下异常:
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)
我不明白是什么导致了异常,因为在我的 Activity 中定义了以下方法
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
【问题讨论】:
-
我遇到了同样的问题,似乎与将自定义主题应用于 ActionBarSherlock 有关,但不确定...您使用的是自定义主题吗?
-
是的,我正在使用自定义主题。
-
是的,这发生在我真正的 4.0.3 设备上,但不是在 4.1 模拟器中。我只能假设这是 Android 中的一个错误,此后已被修复。我没有使用 ActionBarSherlock。
-
下面有一些很好的答案。接受答案将是一件好事!
标签: android android-actionbar actionbarsherlock