0

基本的に、for ループ内でボタンを作成しています。ボタンを押すと、各ボタンが異なる値を返す必要があります。

独自の onClickListener() を作成し、初期化時にパラメーターとして必要なデータを渡すとうまくいくと考えていました。私が思いついたものには構文エラーはないようですが、実行時にボタンをクリックするとアプリがクラッシュします。

これまでに得たものの簡略化されたバージョンを次に示します。

int counter = 1;
for( Program element :  someList)
    {
    //some other code for dynamically creating textviews to stick the buttons in

    //code which creates the buttons on the fly
    moreInfo = new Button(this);
    moreInfo.setText("More Info");  
    moreInfo.setOnClickListener(new DynamicOnClickListener(counter));
    counter++;

    }

カスタム リスナー クラス

import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class DynamicOnClickListener implements OnClickListener
{

    int counter;
    public DynamicOnClickListener(int acounter) {
         this.counter = acounter;
    }

    public void onClick(View v) {
        Log.v("DynamicOnClickListener","1");
        Toast.makeText(v.getContext(), counter, Toast.LENGTH_LONG).show();
    }

 }

したがって、理論的には、これが機能した場合、各ボタンは異なる数値を返すことになりますが、それが理にかなっていることを願っています.

4

2 に答える 2

3

Toast.makeText2 番目の引数として文字列リソース ID を取ります。カウンター値が有効なリソース ID ではないため、エラーが発生しています。String代わりにa を渡す必要がありint、それは機能します。

Toast.makeText(v.getContext(), String.valueOf(counter), Toast.LENGTH_LONG).show();
于 2013-03-04T17:23:15.913 に答える
1

複数のリスナーを作成する代わりに、 setTag() を使用できます

moreInfo = new Button(this);
moreInfo.setText("More Info");
moreInfo.setTag(new Integer(counter));
moreInfo.setOnClickListener(new DynamicOnClickListener();

次に、リスナーで

public void onClick(View v) {
    Log.v("DynamicOnClickListener","1");
    Toast.makeText(v.getContext(), ((Integer)v.getTag()).toString(), Toast.LENGTH_LONG).show();
}
于 2013-03-04T17:30:14.577 に答える