14

これは重複した質問のように思えますが、関連するトピックについて適切な回答を見つけることができませんでした.

OnClickのイベントを処理する最善の方法は何かについて、たくさんの質問がありますButton
ここに私が遭遇したいくつかのオプションがあります:

1 -OnCreateメソッドでプログラムによってリスナーを定義する:

button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        //do stuff
    }
});

2 - android:OnClickXML でプロパティを設定する:

<Button android:id="@+id/btnDelete"
    ...
    android:OnClick="btnDelete_OnClick"/>

OnClickListener3 - クラスにインターフェイスを実装Activityし、ボタンへの自己参照を渡します。

public class MainActivity extends Activity implements OnClickListener{
    @Override
    public void onClick(View v) {
        //do stuff
    }

    protected void onCreate(Bundle savedInstanceState) {
        ...
        button.setOnClickListener(this);
    }
}

4 - 次のOnClickListenerタイプのフィールドを作成します。

private OnClickListener onClickHandler = new OnClickListener(){

    @Override
    public void onClick(View v) {
        //stuff
    }
};

protected void onCreate(Bundle savedInstanceState) {
    ...
    button.setOnClickListener(onClickHandler);
}

Buttonおよびイベントに関してはOnClick、常に XML で定義することを好みます。XML の方がクリーンです。

OnItemClickしかし、 fromListViewOnTimeSetfromのような他のイベントはTimePickerDialogどうでしょうか? XML で設定するために表示できるプロパティはありません。Listener インターフェースの実装はかなりクリーンなソリューションだと思いますが、それは一度しか実装できないことを意味し、2 つの同等のビューがある場合、それらのイベントを同じ場所で処理する必要があります。オプション 2 または 4 を使用すると、UI からさまざまなビューの複数のイベントを処理するときに、おそらく非常に面倒になります。

イベント処理の実装に他のオプションがある場合は、この件に関して他の意見を求めたいと思います。より良いものとして定義できる代替案は本当にあるのでしょうか、それとも各プログラマーの個人的な問題に過ぎないのでしょうか?

4

5 に答える 5

3

ケースバイケースで説明してみましょう。

ケース#1 この方法では、ボタンを作成するのと同じくらい匿名のクラスが作成され(すべてのボタンに新しいリスナーが必要になります)、読みにくく、コストがかかります。

Case# 2 実際にこの背後にあるコードを読むと、リフレクションを使用してコールバックのリスナー (メソッド) を見つけていることがわかりますが、読みにくく、他の開発者を混乱させます。

ケース#3 現在のボタンで使用しているリスナーのタイプを判断できないため、この方法はナビゲートが困難です(Eclipsethisが指しているメソッドを強調表示することは知っていますが、巨大なコードでは難しいと思います見つけるには)。

Case# 4 これはリスナーを実装する最良の方法だと思います。ナビゲートしやすく、より読みやすく、1 つのリスナーで関連するすべてのイベントを処理できます (Eclipse を使用ctrl+clickすると、リスナーに移動するだけで済みます)。したがって、これをお勧めします(仕事ではこの方法しか使用していません)

これが役立つことを願っています

于 2013-03-04T21:24:50.743 に答える
1
  1. クラスにリスナーが 1 つまたは 2 つしかない場合は、この方法が気に入っています。リストビューのonItemClickListener. 複数のビューを使用すると、実際には非常に面倒になります。

  2. android:onClick自分のコードを自分のコードに残しておきたいという理由だけで、私はまったく使用しません。

  3. 処理するビューがいくつかある場合、これが好きです。onClick()ただし、コードをまばらにしておくのが好きです。これは通常switch、ID によるものになり、同様のビューのグループが追加のメソッドを呼び出して、同様の処理を行いhandleDownVote()ます。このようにして、私の主要な「処理」呼び出しはすべて 1 か所で行われます。

  4. 私は人々がこれをしたとは知りませんでした。#3 よりも同様のビューをグループ化する機能が優れていると思いますが、実際に考えたことはありません。多分私はそれをしばらく試してみます。

ただし、結局のところ、これは非常に主観的な質問です。これを行うための「正しい」または「最適化された」方法は実際には存在しないためです。ご覧のとおり、これまでのすべての答えは異なっていました。不快ではありませんが、閉じるために投票してください。

于 2013-03-04T21:37:29.887 に答える
0

別の可能性があります

class MyListener implements onClickHandler{
    public MyListener(SomeType parameter)
    {
       m_parameter = parameter;
    }
    @Override
    public void onClick(View v) {
        // do some stuff based on the value of m_parameter
    }
    private SomeType m_parameter;
};

protected void onCreate(Bundle savedInstanceState) {
    ...
    findViewById(R.id.Button1).setOnClickListener(new MyListener(parameter1));
    findViewById(R.id.Button2).setOnClickListener(new MyListener(parameter2));
    ...
}

これにより、クリックされたビュー (ボタン) に基づいて何をすべきかを把握する必要がなくなります。リソース ID やボタン ID を MyListener オブジェクトに "ハードコーディング" することなく、さらにリッチなアクションの指定をサポートするために、コンストラクターに複数のパラメーターを指定できることは明らかです。

于 2013-03-04T22:01:47.107 に答える
0

まず、誰もが匿名の内部クラスを読むことに慣れる必要があります。それらはグロスですが、広く使用されており、たくさん見られます。

とはいえ、ローカライズされているため、#1 を選択します。追加する場所で、関心のあるボタンのリスナーとして追加しているものがわかります。複数のボタンをリッスンできます (クラス レベルでリスナーを実装するのに対して)。

スタイルに関しては、単一のメソッドを持つ匿名の内部クラスを次のように実装することをお勧めします。

button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        //do stuff
    }});

"}});" 大きな目障りです - それは意図的です。古い「痛い親指」のように突き出ています。これはあなたの目を引き、何か特別なことが起こっていることを認識させます - 匿名の内部クラス定義の終わりです。匿名の内部クラスは読みにくい場合があります。この醜さは、実際には読みやすさに役立ちます。

于 2013-03-04T23:31:26.147 に答える
0

Button の OnClick イベントを処理する最善の方法は、次のいくつかの条件に依存します。

1. 持っているボタンの数。

回答: ボタンが 1 つしかない場合は、匿名クラスを作成する最初のアプローチを使用できます。ただし、複数のボタンがある場合、匿名の onClicklistener を複数作成するのは適切ではありません。しかし、他のオプションを使用するには

2.メモリの最適化

回答: Activity クラスに OnClickListener インターフェイスを実装し、Button への自己参照を渡す場合、onclick リスナーはそのアクティビティ オブジェクトへの参照を保持するため、アクティビティのオブジェクト全体を保持するのは重くなります。 OnClickListener タイプのローカル変数がより最適化された方法です。

したがって、全体的なベスト プラクティスは、OnClickListener タイプのローカル変数を作成することです。これは、ボタンの onClick イベントだけでなく、あらゆるタイプのイベントを処理するための最良の方法です。

于 2013-03-04T12:04:07.763 に答える