2016-10-27 15 views
-2

エラーがintfinalとして設定されていない限りpublic void pressed内、変数iにアクセスすることができないということです。しかし、finalと設定すると、i++がエラーになります。私のインライン関数内からi変数にアクセスできない限り、私は立ち往生しています。これは可能ですか?匿名クラス内ループ変数へのアクセス

for (int i = 0; i < level.myItems.size(); i++) { 
    itemsInInventory[i].setButtonListener(new UIButtonListener() { 
     public void pressed(UIButton button, Sprites sprite) { 
      itemsInInventory[i].performAction();; 
     } 
    }); 
} 
+0

これはインライン関数ではなく、匿名クラスです。 – chrylis

+0

'i'をクラス内のグローバル変数にします。それで最後にする必要はなく、 'public void pressed'内でアクセスすることもできます。 –

答えて

1

問題は、あなたの変数の寿命はループのために結びついているということですが、あなたが作成しているオブジェクトは、永遠に生きることができます。このようなことをするためには、変数は最終的なものでなければならないので、コンパイラは匿名クラスの中に隠しコピーを作成できることを知っています。あなたはこれを行うことができます:

for(int i = 0; i < foo; i++) { 
    final int index = i; 
    ... anonymous class using "index"... 
} 

Java 8はこれを少しシンプルにしますが、Android N以降でのみ利用できます。

+0

' final int index = i; ' –

+0

@ElliottFrischありがとう、あまりにも多くのGroovy。 – chrylis

4

あなたは、ループ内finalローカル変数を宣言することができます。

for(int i = 0; i < level.myItems.size(); i++){ 
    final int j = i; 
    itemsInInventory[i].setButtonListener(new UIButtonListener(){ 
     public void pressed(UIButton button, Sprites sprite){ 
      itemsInInventory[j].performAction(); 
     } 
    }); 
} 

または、より良い、あなただけのi、ボタンをする必要はありませんので、:

for(int i = 0; i < level.myItems.size(); i++){ 
    final UIButton btn = itemsInInventory[i]; 
    btn.setButtonListener(new UIButtonListener(){ 
     public void pressed(UIButton button, Sprites sprite){ 
      btn.performAction(); 
     } 
    }); 
} 

あるいはさらに良い(以降、おそらくpressedの最初の引数はボタン自体です):

for(int i = 0; i < level.myItems.size(); i++){ 
    itemsInInventory[i].setButtonListener(new UIButtonListener(){ 
     public void pressed(UIButton button, Sprites sprite){ 
      button.performAction(); 
     } 
    }); 
} 

最後のバージョンでは、ボタンごとに別々のUIButtonListenerは必要ありません。それらのすべてに同じリスナーを持たせるように設定すると、リスナーは適切なボタンに自動的にディスパッチします。

UIButtonListener listener = new UIButtonListener(){ 
    public void pressed(UIButton button, Sprites sprite){ 
     button.performAction(); 
    } 
}; 
for(int i = 0; i < level.myItems.size(); i++){ 
    itemsInInventory[i].setButtonListener(listener); 
} 
+0

私はあなたが 'final int j = i;'を意味すると思います –

+0

すごい!ありがとう、トン!私はなぜそれを理解できるのか分からない! –

+0

@ElliottFrisch - それはまさに私が意味していたものです。ありがとう! –

関連する問題