web-dev-qa-db-ja.com

Android XMLのonClickとOnClickListener

私は以前に同様の言葉で質問されたことを知っていますが、これは異なります。私はAndroidアプリの開発にかなり慣れており、Android:onclick="" XML属性とsetOnClickListenerメソッドの違いについて3つの質問があります。

  1. 2つの違いは何ですか? 2つの実装の違いは、コンパイル時または実行時、あるいはその両方で見つかりましたか?

  2. どの実装がどの実装に適していますか?

  3. Androidのフラグメントを使用すると、実装の選択にどのような違いがありますか?

75
KG6ZVP

OnClickListenerとOnClickの違い:

  • OnClickListenerは、実装する必要があるインターフェイスであり、Javaコードのビューに設定できます。
  • OnClickListenerは誰かが実際にクリックするのを待つもので、onclickは誰かがクリックしたときに何が起こるかを決定します。
  • 最近Androidは、Android:onclickと呼ばれるビューにxml属性を追加しました。これは、インターフェースを実装することなく、ビューのアクティビティで直接クリックを処理するために使用できます。
  • 必要に応じて、あるリスナー実装と別のリスナー実装を簡単に交換できます。
  • OnClickListenerを使用すると、クリックイベントのアクション/動作を、イベントをトリガーするビューから分離できます。単純な場合はそれほど大したことではありませんが、複雑なイベント処理では、コードの読みやすさと保守性が向上する可能性があります
  • OnClickListenerはインターフェイスであるため、それを実装するクラスには、イベントを処理するために必要なインスタンス変数とメソッドを決定する柔軟性があります。繰り返しますが、これは単純なケースでは大したことではありませんが、複雑なケースでは、イベント処理に関連する変数/メソッドを、イベントをトリガーするビューのコードと混同する必要はありません。
  • XMLレイアウトの関数バインドを使用したonClickは、onClickとそれが呼び出す関数の間のバインドです。 onClickが機能するには、関数に1つの引数(ビュー)が必要です。

どちらも同じように機能し、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未満をターゲットにしている場合は使用できません。

113
Jebasuthan

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)を使用することをお勧めします

13
Livio

単に:

Android:onClick = "someMethod"xmlがある場合、Activityクラスでpublic void someMethodを探します。 OnClickListenerはright アクティビティからと呼ばれ、特定のViewにリンクされています。たとえば、someButton.setOnClickListenerと以下のコードでは、someButtonが押されたときに何をする必要があるかが示されています。

それが役に立てば幸い :)

11
marson

前に述べたように、両方ともイベント(この場合は「クリック」イベント)に応答してロジックを追加する方法です。

HTML/JavaScriptの世界と同じように、ロジックとプレゼンテーションを分離します。XMLをプレゼンテーション用に残し、コードを使用してイベントリスナーを追加します。

2

実行時にButtonをインスタンス化しない場合、またはFragmentサブクラスでクリック動作を宣言する必要がある場合など、正当な理由がない限り、常にAndroid:onClick属性を使用する方が便利です。

0
Mustapha Hadid

1つのメソッドのみを使用する複数のボタンがある場合は、Javaで実行することをお勧めします。ただし、1つの特定のメソッドを持つボタンがある場合は、XMLのonClickの方が適しています。

0
Megs