1. ホーム
  2. android

[解決済み] android:onClick XML属性とsetOnClickListenerは具体的にどのように違うのですか?

2022-03-22 12:24:06

質問

私が読んだ限りでは、このような場合は onClick ハンドラをボタンに割り当てるには、2つの方法があります。

を使用する android:onClick XML 属性で、パブリック メソッドの名前をシグネチャとして使用します。 void name(View v) を使用するか、あるいは setOnClickListener メソッドを実装したオブジェクトを渡します。 OnClickListener インターフェイスを使用します。後者の場合、個人的には好きではない無名クラスが必要になることが多いのですが(個人的な趣味です)、内部クラスで OnClickListener .

XML属性を使用すると、クラスの代わりにメソッドを定義するだけでよいのです。 同じことをXMLレイアウトではなく、コードで行うことができるのか疑問に思っています。

どのように解決するのですか?

いいえ、それはコードで可能ではありません。Androidでは OnClickListener を定義する際に android:onClick="someMethod" 属性を使用します。

この2つのコードスニペットは、2つの異なる方法で実装されているだけで、同じものです。

コードの実装

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
}

上記は OnClickListener . そして、これがXMLの実装です。

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 -->

バックグラウンドでは、AndroidはJavaのコード以外何もせず、クリックイベントであなたのメソッドを呼び出します。

上記のXMLでは、Androidは onClick メソッド myFancyMethod() は、現在のActivityの中だけです。フラグメントを使って上記のXMLを追加しても、Androidは onClick メソッドを .java ファイルを作成し、XML を追加するために使用します。

もう一つ重要なことに気づきました。あなたは、匿名の メソッド . あなたが言いたかったのは、匿名の クラス .