以前にも同じような言葉で質問されたことがあると思いますが、これは違います。私はAndroidアプリの開発にかなり慣れていないので、android:onclick=""
XML属性とsetOnClickListener
メソッドの違いについて3つの質問があります。
2つの違いは何ですか?2つの実装の違いは、コンパイル時または実行時、あるいはその両方で見つかりますか?
どのユースケースがどの実装に有利ですか?
Androidでフラグメントを使用すると、実装の選択にどのような違いがありますか?
以前にも同じような言葉で質問されたことがあると思いますが、これは違います。私はAndroidアプリの開発にかなり慣れていないので、android:onclick=""
XML属性とsetOnClickListener
メソッドの違いについて3つの質問があります。
2つの違いは何ですか?2つの実装の違いは、コンパイル時または実行時、あるいはその両方で見つかりますか?
どのユースケースがどの実装に有利ですか?
Androidでフラグメントを使用すると、実装の選択にどのような違いがありますか?
android:onclick
便利なときが好きですが、問題が発生することもあり、それも思い出せません:)
回答:
OnClickListenerとOnClickの違い:
どちらも同じように機能しますが、一方はJavaコードを介して設定され、もう一方は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
か?
前に述べたように、どちらもイベント(この場合は「クリック」イベント)に応答してロジックを追加する方法です。
HTML / JavaScriptの世界と同じように、ロジックとプレゼンテーションを分離します。プレゼンテーション用にXMLを残し、コードを使用してイベントリスナーを追加します。
実行時にButtonをインスタンス化する場合や、Fragmentサブクラスでクリック動作を宣言する必要がある場合など、正当な理由がない限り、常にandroid:onClick属性を使用する方が便利です。
プログラムでを設定する理由はいくつかありますOnClickListener
。1つ目は、アプリの実行中にボタンの動作を変更したい場合です。ボタンを別のメソッドに完全に向けるOnClickListener
ことも、何もしないように設定してボタンを無効にすることもできます。
onClick
属性を使用してリスナーを定義すると、ビューはそのホストアクティビティでのみその名前のメソッドを探します。プログラムでを設定するとOnClickListener
、ホストアクティビティ以外の場所からボタンの動作を制御できます。これはFragments
、基本的にミニアクティビティであるを使用するときに非常に関連性が高くなり、独自のライフサイクルでビューの再利用可能なコレクションを構築して、アクティビティにまとめることができます。フラグメントOnClickListeners
はアクティビティではないため、ボタンを制御するために常に使用する必要があり、onClickで定義されたリスナーは検索されません。
それらの主な違いは次のとおりです。
OnClick:ボタンを指でクリックしたとき。
OnClickListner:さまざまなコードで実装されるのは幅広い選択肢かもしれません。
たとえば、url "ymail.com"と入力すると、yahooはブラウザからユーザー名とパスワードを検索し、[状態]ボタンをクリックしてメールを開きます。このアクションは、onClickListenerでのみ実装する必要があります。
これが私の考えです!
onclick
すべてのクラスがそのメソッドを実装していることを確認する必要があるため、xmlを使用するときは注意が必要です。これは、レイアウトを複数回使用していることを前提としています。ただし、メソッドがそれを実装するすべてのクラスにあることを確認するためのJavaインターフェースがあれば、心配する必要はありません。