0

私は最近 Android に取り掛かり、内部クラスに関する例を見てきましたが、それらの使用方法がよくわかりません。リスナーを作成するときや、完全なクラスを作成する必要がないときによく使用されますよね? 誰かが素人の言葉で私に説明できるかもしれませんが、この状況で内部匿名クラスを使用する代わりに何ができるでしょうか? このコード:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

ありがとう

4

3 に答える 3

4

別のパターンの 1 つは、コンテナー クラス自体をリスナーにすることです。

public class MyClass implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button is clicked
    }

    public void initOrSomething() {
        button.setOnClickListener(this);
    }
}

ただし、異なる動作が必要なボタンが複数ある場合は、問題が発生する可能性があります。

もう 1 つの方法は、ボタンごとに異なるリスナー クラスを用意することです。

public class Button1Listener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button1 is clicked
    }
}

public class Button2Listener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // Do something when button2 is clicked
    }
}


button1.setOnClickListener(new Button1Listener());
button2.setOnClickListener(new Button2Listener());

匿名内部クラスは、2 番目のパターンをよりコンパクトに表現したものです。

編集: 両方のパターンのバリエーションが可能です。どちらのボタンがクリックされたかを判断するために View オブジェクトの内容が調べられるか、リスナーの動作を変更するためにコンストラクター引数がリスナー クラスに渡されます。

于 2014-03-14T22:56:23.433 に答える
0

リスナーを作成するときや、完全なクラスを作成する必要がないときによく使用されますよね?

Android のリスナー、または他の状況の他のインターフェース。しかし、本質的には、それだけです。

この状況で内部匿名クラスを使用する代わりに何ができますか?

このインターフェイスを実装するクラスを作成し、それを引数として送信することになります。例えば:

public class MyListener
    implements View.OnClickListener
{
    // implement onClick(), etc etc
}

// In code:

button.setOnClickListener(new MyListener(...));
于 2014-03-14T22:56:11.353 に答える
0

それは非常に簡単です。あなたがしているのは、クラスを作成することだけです。JVM (この場合は dalvik) の場合、クラスが独自のコンパイル ユニット (ファイル)、内部クラス、匿名クラス (*) のいずれであるかは問題ではありません。したがって、3 つの同等に有効なオプションがあります。

オプション 1あなたの例:

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

オプション 2名前付き内部クラス:

public MyActivity extends Activity {

 static class MyListener implements View.OnClickListener {
   @Override 
   public void onClick(View v) {
    // do something 
   }
}
....

  button.setOnClickListener(new MyListener());
}

およびオプション 3の異なるファイル:

ファイル MyListener.java

public class MyListener implements View.OnClickListener {
 @Override 
 public void onClick(View v) {
  // do something 
 }
}

ファイル MyActivity.java

import MyListener.java
public MyActivity extends Activity {
....

  button.setOnClickListener(new MyListener());
}

これらのオプションのどれを使用するかは、完全に主観的なものです。ニーズと使用法に応じて、どちらかがより理にかなっています。ただし、通常、UI リスナーでは、プログラミングしているアクティビティのロジックから切り離されたロジックは必要ありません。したがって、匿名クラスを使用します。すべてのコードが 1 か所にとどまり、適切に読みやすくなるためです。

于 2014-03-14T22:56:48.183 に答える