2013-10-25 32 views
0

我有40多個TextViews,我想補充他們click事件,但我嘗試做「不久」:代碼setOnClickListener多個TextViews

final GridLayout myGL; 
myGL = (GridLayout) v0725.findViewById(R.id.tab1); 
for( int i = 0; i < myGL.getChildCount(); i++) 
     if (getResources().getResourceEntryName(((TextView) myGL.getChildAt(i)).getId()).indexOf("v")==0) { 
      ((TextView) myGL.getChildAt(i)).setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 

        Log.v("edf", getResources().getResourceEntryName(((TextView) myGL.getChildAt(i)).getId())); 

     } 
    }); 
}; 

但是Eclipse停止我就Log.v線,因爲i應該是最後的(但我不能) 任何提示?

+0

如果使用'GridView',你應該使用'Adapter' ...例如:htt p://www.mkyong.com/android/android-gridview-example/ – MikeKeepsOnShine

回答

0

您需要聲明域最終值,以便編譯器保證值在匿名內部類的生命週期內不會更改。因爲我被用作循環計數器,所以很肯定值會改變。

所以你需要將i的值複製到一個標記爲final的變量中。

for( int i = 0; i < myGL.getChildCount(); i++) { 
    final int j = i; 
    ... 
      Log.v("edf", getResources().getResourceEntryName(((TextView) myGL.getChildAt(j)).getId())); 

} 
1

您的活動必須工具:

public class YourActivity implements View.OnClickListener 

,你必須覆蓋mwthod的onClick(查看視圖):

public void onClick(View view) { 
    Log.v("edf", getResources().getResourceEntryName(view.getId())); 
} 

和你的循環:

for(int i = 0; i < myGL.getChildCount(); i++) { 
    if (getResources().getResourceEntryName(((TextView) myGL.getChildAt(i)).getId()).indexOf("v")==0) { 
     myGL.getChildAt(i).setOnClickListener(this); 
    } 
}); 
+0

是的,這是正確的做法。無視我的答案,因爲它只涉及將變量值傳遞給匿名內部類的技術性。 – Torben