为不同的按钮设置不同的onClickListener

时间:2013-12-23 16:28:41

标签: android

我有一项活动,其中有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 +“被点击!”

4 个答案:

答案 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();
}
}