1

したがって、ボタンの配列リストを反復処理するときに、すべての onClickedListener()/onFocusChangedListener() を設定しようとしていますが、配列リスト内のボタンを変更することになると、それが最終的でなければならないことがわかります。

コード:

        for(Button aBtn : menu_Buttons)
    {
        aBtn.setOnFocusChangeListener(new OnFocusChangeListener(){

            @Override
            public void onFocusChange(View arg0, boolean changed) {
                Log.i("LC", "focus changed");
                if(changed)
                 {
                    aBtn.setTextColor(Color.parseColor("#FFFFFF"));
                     Log.i("LC", "true");
                 }
                 else
                 {
                     aBtn.setTextColor(Color.parseColor("#CD6839"));
                     Log.i("LC", "false");
                 }
            }
        });
    }

そのため、代わりにこのようにするよう求めます。

for(final Button aBtn : menu_Buttons)

誰かが私にこれを説明できますか、私は今 100% で働いていないので、なぜ最終的なものでなければならないのかわかりません.

他の方法を使用して配列リストを反復処理する他の方法を見つけましたが、これは私を悩ませています。

4

2 に答える 2

1

一歩戻って、ここで何が起こっているか見てみましょう。

  1. インスタンス変数があります(Button aBtn)
  2. このインスタンス変数を内部クラス (new OnFocusChangeListener(){...}) で参照している

ここで覚えておくべき重要なことは、内部クラスのメソッドが未定義の後日に呼び出されるということです。したがって、それに含まれるメソッドは、現在の実行フローとは別のものです。次のコードを想像してください。

   for(Button aBtn : menu_Buttons)
{
    aBtn.setOnFocusChangeListener(new OnFocusChangeListener(){

        @Override
        public void onFocusChange(View arg0, boolean changed) {
            Log.i("LC", "focus changed");
            if(changed)
             {
                aBtn.setTextColor(Color.parseColor("#FFFFFF"));
                 Log.i("LC", "true");
             }
             else
             {
                 aBtn.setTextColor(Color.parseColor("#CD6839"));
                 Log.i("LC", "false");
             }
        }
    });

   if(someCondition) {
      aBtn = someOtherButton;
   }
}

この場合、aBtn が変更されたので、そのメソッドの 1 つが呼び出されたときに、内部クラスはどの Button インスタンスを使用する必要がありますか? コンパイラーがどちらを選択したとしても、プログラマーにはあいまいさが生じ、その結果、微妙で追跡が困難なバグの原因になりやすくなります。

内部クラスで参照されるインスタンス変数に final を強制することにより、コンパイラはこのあいまいさを取り除き、正しいプログラムのコーディングを容易にします。

于 2013-08-11T12:39:50.823 に答える
1

final キーワードは、スコープ内で変数の値を変更できないことを意味します。ループの例では、変数がループの最後でスコープ外になり、ループの最初で新しい値でスコープに戻ると考えることができます。ループ内の変数への割り当ては機能しません。

于 2013-08-11T12:35:34.320 に答える