0

我有 40 多个TextViews,我想click在它们上添加事件,但我尝试“很快”做到这一点:

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应该是最终的(但我不能)任何提示?

4

2 回答 2

1

您的 Activity 必须实现:

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);
    }
});
于 2013-10-25T09:46:27.250 回答
0

您需要声明字段 final 以便编译器保证该值在匿名内部类的生命周期内不会更改。由于 i 用作循环计数器,因此可以肯定该值会发生变化。

因此,您需要将 i 的值复制到标记为 final 的变量中。

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

}
于 2013-10-25T09:42:00.587 回答