Android:用于自定义视图的onCLickListener

问题描述 投票:0回答:3

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

但是只要我在Activity中设置另一个onClickListener与其他方法进行交互,就只会调用Activity中的onClickListener并忽略View中的那个。

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

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

有任何想法吗?提前致谢!

android onclicklistener
3个回答
2
投票

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


0
投票

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

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

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


0
投票

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

  1. 在自定义视图中声明一个onClickListener类型的变量:
private OnClickListener onClickListener;
  1. 用这种方式覆盖这两种方法:
@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
@Override
public void setOnClickListener(OnClickListener l) {
    onClickListener = l;
}

而已。

© www.soinside.com 2019 - 2024. All rights reserved.