2010-11-07 106 views
1
for (int i=0; i<pages; i++) { 
     ImageView img=new ImageView(this); 
      ... 

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


      } 
     }); 

     FLall.addView(img); 
    } 

我該如何在java中做到這一點?我總是得到「不能指非最終變量i在不同的方法定義的內部類中」Java不能引用非最終變量

回答

8

setOnClickListener調用之前:

final int thisIndex = i; 

,然後參考thisIndex在處理程序。

+0

打倒我吧。我剛剛完成了鍵入,但使用i2作爲變量。 – developmentalinsanity 2010-11-07 13:09:28

9

儘管您可以創建一個垃圾變量並將其標記爲final我實際上更喜歡只通過構造函數傳遞此值。這有點不簡單,但如果你決定在某個時候移動你的匿名內部類,它會更容易維護。

for (int i=0; i<pages; i++) { 
    ImageView img=new ImageView(this); 
    ... 

    img.setOnClickListener(new OnClickListener(i) { 
     private int ind; 
     public OnClickListener(int ind){ 
      super(); 
      this.ind = ind; 
     } 
     @Override 
     public void onClick(View v) { 
      showpage(ind); 
     } 
    }); 

    FLall.addView(img); 
} 
+0

我想OnClickListener將不得不有一個接受參數的構造函數。 (如果它不是第三方,或者不是內置的Java,否則不可行)。當我嘗試這樣做時,有人抱怨說沒有這樣的構造函數存在,並且您爲匿名實現提供的構造函數也會導致錯誤。 – H2ONaCl 2011-09-22 10:54:39