2012-08-01 70 views
1

我是Android編程新手。
我想使用for循環來做類似的事情。
這裏是我的代碼:android setOnclickListener onClick方法非最終變量

int stubs[] = {R.id.stub_1, R.id.stub_2, R.id.stub_3}; 
View viewStubs[] = {stub_1, stub_2e, stub_3}; 
Button buttons[] = {button2, button3, button4}; 
button2 = (Button)findViewById(R.id.button2); 
button3 = (Button)findViewById(R.id.button3); 
button4 = (Button)findViewById(R.id.button4); 
for(int i=0; i<buttons.length; i++){ 
      buttons[i].setOnClickListener(new View.OnClickListener() {  
       public void onClick(View v) { 
        if(viewStubs[i] == null){ 
         viewStubs[i] = ((ViewStub)findViewById(stubs[i])).inflate(); 
        } 

       } 
      } 
     } 

然而,在方法的onClick 「我」 的錯誤:
Cannot refer to a non-final variable i inside an inner class defined in a different method

+0

檢查以下問題 http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a -differen – barrel 2012-08-01 10:32:11

+0

在Java中沒有關閉的版本少於7!你不能在內部類中使用局部var'i'。你應該重寫你的代碼 – Serjio 2012-08-01 10:36:49

+1

你可以做一個最終的int var並將它分配給我。然後將新的var傳遞給內部類... – Shark 2012-08-01 10:40:38

回答

0

嘗試int i之前添加final

+0

這有幫助不會工作。在for循環中添加final變量意味着變量值不能被更改,因此它會開始拋出一些其他錯誤,如「最終局部變量不能被賦值」。 – 2012-08-01 10:33:30

+0

這是錯誤的。我們不能在for循環變量i中添加最終變量if – jjLin 2012-08-01 10:35:21

+0

想象循環遍歷最終變量,並且得到爲什麼它是一個問題。 – Shark 2012-08-01 10:37:26

0

viewStubs數組應該是this類的屬性(它似乎可能是靜態的)。

int stubs[] = {R.id.stub_1, R.id.stub_2, R.id.stub_3}; 
// viewStubs should be a property of this class (maybe static) 
viewStubs[] = {stub_1, stub_2, stub_3}; 

Button buttons[] = { 
    (Button)findViewById(R.id.button2), 
    (Button)findViewById(R.id.button3), 
    (Button)findViewById(R.id.button4) 
}; 

for (int i=0; i<buttons.length; i++) { 
    View.OnClickListener listener = new View.OnClickListener() { 
     private int viewId; 

     private int stubId; 

     public void onClick(View v) { 
      if (viewStubs[stubId] == null) { 
       viewStubs[stubId] = (ViewStub)findViewById(viewId).inflate(); 
      } 
     } 

     public View.OnClickListener setIds(int vid, int sid) { 
      viewId = vid; 
      stubId = sid; 
      return this; 
     } 
    } 
    buttons[i].setOnClickListener(listener.setIds(stubs[i], i)); 
} 
0

對(INT I = 0;我< something.length;我++){

final int inmutable_index = i; 

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

}

現在可以使用內部for循環最終變量inmutable_index沒有任何問題,只需替換inmutable_index變量的內部類中i變量的所有用法。