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

あなたのアクティビティは以下を実装する必要があります:

public class YourActivity implements View.OnClickListener 

mwthod onClick(View ビュー) をオーバーライドする必要があります。

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 に答える