1

私はかなりくだらない本を持っているので、どちらの形式を使用する理由もわかりません。

それが行われる最初の方法は次のようになります

 Button button = (Button) findViewById(R.id.btnButton)

 button.setOnClickListener(new OnClickListener() {
//code code code }

次に、私たちの本はローカルではなくグローバル変数を使用したいので、ランダムに別の方法で物事を進め始めます

Button btButton;
//Done as Global Variable.

btButton = (Button) findViewById(R.id.btnButton);
btButton.setOnClickListener(bButton);


Button.OnClickListener bButton = new Button.OnClickListener(){
//code }

私の本がひどいのはこのようなことであり、次の本を買わない理由の1つです。それが本当の理由なしに物事を行う方法を変えるだけであるとき、私は嫌いです。それで、誰かが本当にここで違いを教えてもらえますか?ありがとう。

4

6 に答える 6

4

どちらも同じです。最初のクラスは匿名の内部クラスを使用し、secon onはlistnerのオブジェクトを作成し、それをメソッドに渡します。

2番目の方法には、同じlistnerインスタンスの再利用性の利点があります。ただし、一般的にボタンごとに異なるlistnerがあるため、最初の方法が推奨されます。

于 2012-06-26T16:25:42.840 に答える
3

誰もが言うように、違いはありませんが、その理由は誰も説明していません。

Button拡張しViewます。

を使用してonClickListenerいる場合は、で定義されているものを使用していますView。ほとんどの場合、これは機能しますDialogs-、およびおそらく他のいくつかのクラスでは機能しません。

明示的に言うと、クラスで定義されたButton.onClickListenerものを参照していることになります。extendsなので、これはジェネリックを使用するのと同じです。onClickListenerButtonButtonViewonClickListener.

内部の匿名と明示もありますが、これはより好みです。必要なガベージコレクションが少ないという理由だけで、静的onClickListenerを使用すると、内部匿名よりもパフォーマンスが向上しますが、匿名の内部リスナーが30ほどない限り、気付くことはありません。

于 2012-06-26T16:29:12.947 に答える
2

心配することは何もありません。どちらも同じことをします。最初の例では、ボタンに設定したときにOnClickListenerのインスタンスを作成しています。

2番目のケースでは、onClickListenerが事前に作成されており、それへの参照を渡しています。

さまざまな人々がさまざまな方法でそれを行うことを好み、彼らはさまざまな機能に向いています。

明らかに、2番目の例でbButtonと等しく設定することで、後で操作したり、他のボタンリスナーで使用したりできますが、最初のボタンのコピーを使用することはできません。

したがって、複数のボタンにまったく同じコードを使用する場合は、2番目のオプションですべてのボタンにリスナーを追加できます。

それがもう少し明確に見えることを願っています

于 2012-06-26T16:24:15.773 に答える
2

あなたが投稿した2つの例の間に実際の違いはありません。これはAndroidよりもJavaの質問であるため、あなたの本はおそらくこれをカバーしていませんでした。1つ目は、OnClickListenerインスタンスを動的に宣言し、2つ目は、それを統計的に宣言してから参照します。実行時には、それらはまったく同じように動作します。

たとえば、ボタンが複数ある場合は、2番目の例を使用できます。OnClickListenerをそれぞれに渡し、ボタンごとに個別のOnClickListenerを設定する代わりに、OnClickListener内から押されたボタンを処理できます。

于 2012-06-26T16:25:15.440 に答える
2

技術的には、あなたが書くとき:

button.setOnClickListener(new OnClickListener() { ... });

コンパイル時に次のコードに変換されます。

Button.OnClickListener anonymous_listener = new Button.OnClickListener() { ... };
button.setOnClickListener(anonymous_listener);

あなたが提供した2番目の例は悪いです。OnClickListenerメソッド内以外の場所で使用されることのない、への役に立たない参照を格納しますonCreate()。失われるのはわずか8バイト程度ですが、それでも役に立たないため、ローカル変数として定義する必要があります。

于 2012-06-26T16:33:41.010 に答える
2
button.setOnClickListener(new OnClickListener() 

その場でリスナーオブジェクトを作成し、それをsetOnClickListenerに渡したと仮定します。このスタイルは、Javaでは匿名内部クラスとして知られています。2つ目は簡単です。

Button.OnClickListener bButton = new Button.OnClickListener(){

Button.OnClickListenerを使用した理由は、OnClickListenerビュークラスにあるためです。ButtonクラスはViewから継承します。したがって、インポートステートメントを回避するために、Button.OnClickListenerを直接使用しました。

于 2012-06-26T16:35:02.143 に答える