ImageButton与“内部”OnClickListener崩溃

时间:2012-05-24 09:53:51

标签: android imagebutton onclicklistener

出于某种原因,将“内部”OnClickListener附加到ImageButton会导致应用崩溃。对于普通的Button,它运行正常 - 只有ImageButton才能崩溃。

public class SomeWidgets extends Activity implements OnClickListener {
    ....
    button1         = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(this);   
    imagebutton     = (ImageButton)findViewById(R.id.imagebutton)
    imagebutton.setOnClickListener(this);
    ....
    ....
}

单击imagebutton时上面的代码崩溃了。 button1工作正常,即使两者都以完全相同的方式创建并附加到OnClickListener。 (这是崩溃它的点击,而不是onClick处理点击。)

但是,如果我创建一个私有内部OnClickListener类并将其附加到图像按钮,那么它可以正常工作。

有什么想法吗?显然,将“内部”(this) OnClickListener附加到ImageButton时会出现问题,而将其附加到Button时则可以正常工作。

编辑:看起来我发现了问题。如果我像这样重写onClick:

public void onClick(View v) {
   if (((Button)v).getText().equals("A button")) {
      edittext2.setText(edittext1.getText());
      edittext1.setText("");
   }
   if (imagebutton.getId() == R.id.imagebutton) {
      Toast.makeText(SomeWidgets.this, "This is an image button.",       
      Toast.LENGTH_LONG).show();
   }
}
它崩溃了。但是,如果我删除第一个if {}并且只有图像按钮,那么它可以工作。这显然是一个愚蠢的错误,但我很欣赏和解释为什么: - )

5 个答案:

答案 0 :(得分:1)

尝试

if (((Button)v).getText().toString().equals("A button")) {
  edittext2.setText(edittext1.getText().toString());
  edittext1.setText("");
}

答案 1 :(得分:0)

此处更改代码

if (v.getId() == R.id.imagebutton) //imagebutton.getId() replace with View v
   {
      Toast.makeText(SomeWidgets.this, "This is an image button.",       
      Toast.LENGTH_LONG).show();
   }

答案 2 :(得分:0)

崩溃是由imageButton转换为Button造成的,请尝试:

if (v instanceOf ImageButton) {
   if (((ImagaeButton)v).getText().toString().equals("A button")) {

编辑: 如果将OnClickListener添加到Button和ImageButon,则必须先确定所点击的对象是Button还是ImageButton,然后再进行类似(Button)v的转换。 所以你必须做类似的事情:

String ButtonText = "";
if (v instanceOf ImageButton) {
   ButtonText = ((ImageButton) v).getText().toString();
}else if(v InstanceOf Button){
   ButtonText = ((Button) v).getText().toString();
}

答案 3 :(得分:0)

请更新以下代码: -

public void onClick(View v) {
   if (v==button1) {
      edittext2.setText(edittext1.getText());
      edittext1.setText("");
   } else if (v==imagebutton) {
      Toast.makeText(SomeWidgets.this, "This is an image button.",       
      Toast.LENGTH_LONG).show();
   }
}

答案 4 :(得分:0)

谢谢大家的回答。我不知道如何使用toString()错过了。不知怎的,我陷入了ImageButton,并认为这是问题所在。修复了onClick()中Button的文本检查,修复了所有内容。