私は6年前にこの質問をしました。その間に、Android開発のベストプラクティスが変更され、私はより優れた開発者になりました。
それ以来、onClick
XML属性を使用することは悪い習慣であることに気づき、作業中のコードベースからXML属性を削除しました。
すべてのクリックハンドラーは、XMLレイアウトではなく、アプリのコードで定義されるようになりました。
使用しない理由onClick
は
onClick
XML属性の値を間違えると、実行時エラーが発生しやすくなります。- 開発者は、レイアウトから呼び出されていることに気付かずに、クリックハンドラメソッドの名前をリファクタリングする可能性があります(理由1を参照)。
- どのメソッドが実際に呼び出されているかを見つけることは、必ずしも明白ではありません。特にレイアウトがフラグメントによって使用されている場合
- レイアウトと動作の問題を分離するのは良いことです。使用
onClick
するとそれらが混ざり合いますが、これは悪いことです。
私はあなたがレイアウトで決して使用しないことをあなたに確信させたことを望みonClick
ます:)!
onClick
以下は私の最初の質問です。これは、使用が悪い考えである理由のかなり良い例です。
===
XMLでメニュー項目を定義していて、API 11で追加されたonClick属性を使用しようとしています。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