基本上我在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();
}
}
所以从理论上讲,如果这个有效,每个按钮会返回不同的数字,希望这是有意义的。
答案 0 :(得分:3)
Toast.makeText
将字符串资源ID作为第二个参数。您的计数器值不是有效的资源ID,而是您收到错误的方式。您需要传递String
而不是int
才能使用。
Toast.makeText(v.getContext(), String.valueOf(counter), Toast.LENGTH_LONG).show();
答案 1 :(得分: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();
}