私は以前に同様の言葉で質問されたことを知っていますが、これは異なります。私はAndroidアプリの開発にかなり慣れており、Android:onclick=""
XML属性とsetOnClickListener
メソッドの違いについて3つの質問があります。
2つの違いは何ですか? 2つの実装の違いは、コンパイル時または実行時、あるいはその両方で見つかりましたか?
どの実装がどの実装に適していますか?
Androidのフラグメントを使用すると、実装の選択にどのような違いがありますか?
OnClickListenerとOnClickの違い:
どちらも同じように機能し、1つはJavaコードで設定され、もう1つはxmlコードで設定されます。
setOnClickListenerコードの実装:
Button btn = (Button) findViewById(R.id.mybutton);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myFancyMethod(v);
}
});
// some more code
public void myFancyMethod(View v) {
// does something very interesting
}
XML実装:
<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button Android:id="@+id/mybutton"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Click me!"
Android:onClick="myFancyMethod" />
<!-- even more layout elements -->
パフォーマンス:
どちらもパフォーマンスは同じです。 Xmlはコンパイル時にバイナリコードに事前に解析されます。 Xmlにはオーバーヘッドがありません。
制限:
Android:onClickはAPIレベル4以降のため、1.6未満をターゲットにしている場合は使用できません。
Android:onClick
XMLはクリックを処理するのに便利な方法のようですが、setOnClickListener
実装はonClickListener
を追加すること以外の何かをしますが、これについて誰も話していないことにショックを受けました。実際、ビュープロパティclickable
をtrueにします。
ほとんどのAndroid実装では問題ではないかもしれませんが、電話コンストラクターによると、ボタンは常にclickable = trueにデフォルト設定されますが、一部の電話モデルの他のコンストラクターは、ボタン以外のビューでデフォルトのclickable = falseに設定される場合があります。
したがって、XMLを設定するだけでは十分ではないので、ボタン以外にAndroid:clickable="true"
を常に追加する必要があります。デフォルトがclickable = trueであるデバイスがあり、このXML属性を設定するのを一度も忘れた場合、実行時に問題に気付くことはありませんが、顧客の手に渡ると市場でフィードバックを得るでしょう!
さらに、proguardがXML属性とクラスメソッドを難読化して名前を変更する方法については確信が持てないため、いつかバグが発生しないという100%安全ではありません。
そのため、問題が発生することを決して考えたくない場合は、setOnClickListener
または注釈付きのButterKnifeなどのライブラリ@OnClick(R.id.button)
を使用することをお勧めします
単に:
Android:onClick = "someMethod"
xmlがある場合、Activityクラスでpublic void someMethod
を探します。 OnClickListener
はright アクティビティからと呼ばれ、特定のView
にリンクされています。たとえば、someButton.setOnClickListener
と以下のコードでは、someButton
が押されたときに何をする必要があるかが示されています。
それが役に立てば幸い :)
前に述べたように、両方ともイベント(この場合は「クリック」イベント)に応答してロジックを追加する方法です。
HTML/JavaScriptの世界と同じように、ロジックとプレゼンテーションを分離します。XMLをプレゼンテーション用に残し、コードを使用してイベントリスナーを追加します。
実行時にButtonをインスタンス化しない場合、またはFragmentサブクラスでクリック動作を宣言する必要がある場合など、正当な理由がない限り、常にAndroid:onClick属性を使用する方が便利です。
1つのメソッドのみを使用する複数のボタンがある場合は、Javaで実行することをお勧めします。ただし、1つの特定のメソッドを持つボタンがある場合は、XMLのonClickの方が適しています。