为什么onClick没有被称为服装ImageButton?

时间:2016-04-25 23:03:52

标签: android listener onclicklistener

我目前正在Android中扩展一个ImageButton:

public class Pen extends ImageButton {
    public Pen(Context context, AttributeSet attrs) {
        super(context, attrs);  
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("Now I am setting  Pen");
        return true;
    }
}

然后在xml文件中我做:

  .....

   <com.example.testsetimagebmp.Pen
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pen"
        android:background="@drawable/pen" />

   ....

最后在MainActivity中

public class MainActivity extends Activity {

    Pen myImgbutton;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myImgbutton = (Pen) findViewById(R.id.pen);

    myImgbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // Toast.makeText(TravelBite.this, "test", Toast.LENGTH_SHORT).show();
            System.out.println("I am form MainActivity onClick");
        }
    });

    // ....
} 

每当我尝试按下ImageButton onClick时,都会被调用。但是当用ImageButton替换服装笔时一切正常。我是否在继承ImageButton时遗漏了一些内容?

2 个答案:

答案 0 :(得分:2)

  

每当我尝试按下ImageButton onClick时就会被调用

点击是两个事件的序列:ACTION_DOWN和(下一个)ACTION_UP。当您添加onTouchEvent()时,除了您之外没有其他代码知道该视图已被点击,更不用说点击了。因此,不应该执行return true;(它告诉您处理了MotionEvent并且系统知道无法将其交给任何其他侦听器),您应该调用原始代码return super.onTouchEvent(MotionEvent event);来跟踪点击并对点击作出反应或者像过去那样长时间点击并返回它会产生的内容:

@Override
public boolean onTouchEvent(MotionEvent event) {
    System.out.println("Now I am setting  Pen");
    return super.onTouchEvent(event);
}

答案 1 :(得分:1)

通过返回true,您说您已经消耗了Touch个事件,并且没有任何输入事件将被委托给其他侦听器。 你应该使用 -

@Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("Now I am setting  Pen");
        return super.onTouchEvent(event);
    }