2012-05-09 1 views
0

私は、forループ内に一連のイメージボタンをプログラム的に定義しました。各ボタンについて、私はその意図にいくつかのデータを入れてから活動を切り替えるsetOnClickListener関数を定義しました。しかし、どのボタンをクリックしても、検索される余分なデータはループのために最後の値int intに設定されているようです。以下のコードを参照してください:プログラムで作成されたImageButtonで定義されたputExtraデータは最後の値のみを表示しますか?

public void onCreate(Bundle savedInstanceState) { 
    <...> 

     RelativeLayout rl = (RelativeLayout) findViewById(R.id.rlayout); 

     for (int i=1; i<=maxMapLoc; i++) { 
      mapLocation = i; 
      ImageButton btnMapLoc = new ImageButton(FirstActivity.this); 
      RelativeLayout.LayoutParams vp = new RelativeLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
      btnMapLoc.setLayoutParams(vp); 
      btnMapLoc.setBackgroundColor(Color.TRANSPARENT); 
      btnMapLoc.requestLayout(); 
      String imgName = "map_loc_" + mapLocation;     
      int id = getResources().getIdentifier(imgName,"drawable",getPackageName()); 
      btnMapLoc.setImageResource(id); 
      int imgMapLoc = 2000 + mapLocation; 
      btnMapLoc.setId(imgMapLoc); 
      rl.addView(btnMapLoc, vp); 

      btnMapLoc.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
        intent.putExtra("MapLocation", mapLocation); 

        startActivity(intent); 

       } 
      }); 

私は間違っていましたか?

ありがとうございました。

+0

onClickメソッドでボタンのIDを印刷して、クリックしたボタンが実際にトリガーされるボタンであることを確認することができます。したがって、最初のボタンはIDが '2001'で、2番目のボタンのIDは '2002'でなければなりません。おかげさまで – Gophermofur

答えて

3

ボタンに現在のmapLocation値を使用してタグを追加できます。

btnMapLoc.setTag(i); 
... 

// In onClick 
    intent.putExtra("MapLocation", v.getTag()); 
    ... 

あなただけmapLocationの最後の値を取得する理由は、ユーザーがボタンを押すと、あなたのonClick内のコードは、()を実行していることです。言い換えれば、ループがボタンを作成した後、あなたは長い間mapLocationを照会しています。現在のmapLocationへの参照を、タグ機能と同様に、各ループ反復で作成する必要があります。

+0

get-とsetTag関数がトリックを行いました!私はonClick()内のコードが実行時に「ソース」されていることに気づいていませんでした。ダイナミックな割り当てがメモリに記録されるように、コールの内部実装がビューの各インスタンスに「コピーされ、格納される」と考えました。 – Kenny

関連する問題