Android:用于自定义视图的onCLickListener

时间:2011-08-24 17:49:41

标签: android onclicklistener

我创建了一个自定义视图,可以改变他在Click上的外观。 onClickListenerOnTouchEventListener被正确调用了 视图中的appreance已更改。

但是,只要我在活动中设置另一个onClickListener即可与之互动 其他方法,只调用Activity中的onClickListener并调用 View中的一个被忽略了。

是否有可能从视图继承onClickListener到 活动,以便两者(Visualchange和一个方法的调用)OnClick的调用?

我还尝试使用Drawables和StateListDrawable实现View,但也没有任何运气,因为“state_pressed”不会被调用。

有什么想法吗? 提前谢谢!

3 个答案:

答案 0 :(得分:2)

如果要在自定义视图中设置侦听器,必须在自定义视图的构造函数中设置侦听器。否则它不会在外面调用。 (您不应该使用能够处理点击的功能)

答案 1 :(得分:0)

从Activity中设置对象的OnClickListener时,它将覆盖该对象的OnClickListener。如果你在onClick()方法中做了类似的事情,它应该起作用。

public void onClick(View v){
    //Do whatever you want
    super.onClick(v);
}

但是,您可能不应该通过单击或触摸侦听器设置按钮图形。这正是按钮选择器的用途。

答案 2 :(得分:0)

如果要从视图外部设置OnClickListener,例如执行:customView.setOnClickListener(listener),则可以执行以下操作:

  1. 在自定义视图中声明类型为onClickListener的变量:
  2. private OnClickListener onClickListener;
    
    1. 以这种方式覆盖这两种方法:
    2. @Override
      public boolean dispatchKeyEvent(KeyEvent event) {
          if(event.getAction() == KeyEvent.ACTION_UP &&
                  (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER || event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
              if(onClickListener != null) onClickListener.onClick(this);
          }
          return super.dispatchKeyEvent(event);
      }
      @Override
      public boolean dispatchTouchEvent(MotionEvent event) {
          if (event.getAction() == MotionEvent.ACTION_DOWN) {
              setPressed(true);
          }
          else if(event.getAction() == MotionEvent.ACTION_UP) {
              if(onClickListener != null) onClickListener.onClick(this);
              setPressed(false);
          }
          else {
              setPressed(false);
          }
          return super.dispatchTouchEvent(event);
      }
      
      1. 并覆盖setOnClickListener设置变量:
      2. @Override
        public void setOnClickListener(OnClickListener l) {
            onClickListener = l;
        }
        

        就是这样。