我有一项活动,其中有10个相同的imageButton
全部来自同一资源myimage.png
我正在尝试使用onClick
为10个按钮中的每个按钮设置不同的setTag()
侦听器。
但是,所有imageButton
都绑定到同一个侦听器。
这是我的代码:
public class AllButtonsActivity extends Activity {
ImageButton imageButton;
ImageButton allImageButtons[] = new ImageButton[10];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ll);
createButtonsAndAddListener();
}
public void createButtonsAndAddListener() {
LinearLayout parent = (LinearLayout) findViewById(R.id.ll);
for (int i = 0; i < 10; i++) {
imageButton = new ImageButton(this);
imageButton.setImageResource(R.drawable.myimage);
imageButton.setTag(i);
allImageButtons[i] = imageButton;
allImageButtons[i].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int i = (Integer) imageButton.getTag();
Toast.makeText(AllButtonsActivity.this,
"ImageButton"+i+ "is clicked!", Toast.LENGTH_SHORT)
.show();
}
});
parent.addView(imageButton);
}
}
}
我想要的是当点击第i个按钮时,吐司会弹出一条消息:
“ImageButton”+ i +“被点击!”
答案 0 :(得分:3)
改进上面的代码,我建议你只定义一个onClickListener并将其设置为每个imageButton(方法外的变量定义):
OnClickListener click = new OnClickListener(){@Override
public void onClick(View v) {
int i = (Integer) v.getTag();
Toast.makeText(AllButtonsActivity.this,
"ImageButton"+i+ "is clicked!", Toast.LENGTH_SHORT)
.show();
}
});
... 这是上面定义的方法(Dreagen答案):
public void createButtonsAndAddListener() {
LinearLayout parent = (LinearLayout) findViewById(R.id.ll);
for (int i = 0; i < 10; i++) {
ImageButton imageButton = new ImageButton(this);
imageButton.setImageResource(R.drawable.mybutton);
imageButton.setTag(i);
allImageButtons[i] = imageButton;
allImageButtons[i].setOnClickListener(click);
parent.addView(imageButton);
}
}
答案 1 :(得分:2)
您的图像按钮变量正在被循环的每次迭代覆盖。而不是使用您在Activity开始时声明的变量,而不是每次都创建一个新变量
public void createButtonsAndAddListener() {
LinearLayout parent = (LinearLayout) findViewById(R.id.ll);
for (int i = 0; i < 10; i++) {
ImageButton imageButton = new ImageButton(this);
imageButton.setImageResource(R.drawable.mybutton);
imageButton.setTag(i);
allImageButtons[i] = imageButton;
allImageButtons[i].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int i = (Integer) imageButton.getTag();
Toast.makeText(AllButtonsActivity.this,
"ImageButton"+i+ "is clicked!", Toast.LENGTH_SHORT)
.show();
}
});
parent.addView(imageButton);
}
}
将代码更改为上面的代码,并从活动变量声明中删除ImageButton imageButton;
答案 2 :(得分:1)
您需要使用View
中收到的onClick()
(实际上是您的ImageButton
},而不是您当地的imageButton
变量。
@Override
public void onClick(View v) {
int i = (Integer) v.getTag();
Toast.makeText(AllButtonsActivity.this,
"ImageButton"+i+ "is clicked!", Toast.LENGTH_SHORT)
.show();
}
答案 3 :(得分:0)
我知道这个问题已经得到解答,但即使这样,我也想添加这种不同的方法作为答案:
public class AllButtonsActivity extends Activity implements onClickListner{
ImageButton imageButton;
ImageButton allImageButtons[] = new ImageButton[10];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ll);
createButtonsAndAddListener();
}
public void createButtonsAndAddListener() {
LinearLayout parent = (LinearLayout) findViewById(R.id.ll);
for (int i = 0; i < 10; i++) {
imageButton = new ImageButton(this);
imageButton.setImageResource(R.drawable.myimage);
imageButton.setTag(i);
allImageButtons[i] = imageButton;
allImageButtons[i].setOnClickListener(this);
parent.addView(imageButton);
}
}
@Override
public void onClick(View v) {
int i = (Integer) v.getTag();
Toast.makeText(AllButtonsActivity.this,
"ImageButton"+i+ "is clicked!", Toast.LENGTH_SHORT)
.show();
}
}