【问题标题】:Android custom button listener not getting calledAndroid自定义按钮监听器没有被调用
【发布时间】:2016-02-23 20:41:22
【问题描述】:

我有一个自定义 ImageButton,我想在点击时更改它的图像。到目前为止,我还没有能够在按钮内获取 onClick 方法来执行它的操作。

public class FlashButtonView extends ImageButton{
private Drawable mFlashOffSrc, mFlashOnSrc, mFlashAutoSrc;
private Drawable mCurrentFlashMode = mFlashAutoSrc;

public FlashButtonView(Context context) {
    super(context);
}

public FlashButtonView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context.getTheme().obtainStyledAttributes(attrs, R.styleable.FlashButtonView, 0, 0));
}

public FlashButtonView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context.getTheme().obtainStyledAttributes(attrs, R.styleable.FlashButtonView, 0, defStyleAttr));
}

private void init(TypedArray typedArray) {
    try {
        mFlashAutoSrc = typedArray.getDrawable(R.styleable.FlashButtonView_autoSrcImage);
        mFlashOnSrc = typedArray.getDrawable(R.styleable.FlashButtonView_onSrcImage);
        mFlashOffSrc = typedArray.getDrawable(R.styleable.FlashButtonView_offSrcImage);
    } finally {
        typedArray.recycle();
    }

    setImageDrawable(mFlashAutoSrc);
    mCurrentFlashMode = mFlashAutoSrc;

    setOnClickListener( new OnClickListener() {

        @Override
        public void onClick(View v) {
            if(mCurrentFlashMode == mFlashAutoSrc) {
                setImageDrawable(mFlashOnSrc);
                mCurrentFlashMode = mFlashOnSrc;
            }
            else if(mCurrentFlashMode == mFlashOnSrc){
                setImageDrawable(mFlashOffSrc);
                mCurrentFlashMode = mFlashOffSrc;
            }
            else{
                setImageDrawable(mFlashAutoSrc);
                mCurrentFlashMode = mFlashAutoSrc;
            }
        }
    });
}

}

这就是我的 XML 的样子:

<!--.___ Flash on/off switcher __.-->
<blablabla.FlashButtonView
    custom:autoSrcImage="@drawable/button_autoflash"
    custom:offSrcImage="@drawable/button_noflash"
    custom:onSrcImage="@drawable/button_flash"
    android:id="@+id/flash"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="@dimen/distance_20dp"
    android:layout_marginStart="@dimen/distance_20dp"
    android:layout_marginBottom="@dimen/distance_20dp"
    android:background="@android:color/transparent"
    android:clickable="true"/>

我错过了什么或做错了什么?

【问题讨论】:

  • 你确定 init 被调用了吗?
  • 我是,按钮显示正确。从未调用过 onClick 方法。

标签: java android xml layout android-custom-view


【解决方案1】:

实现onTouchEvent() 方法。像这样的:

float touched_x, touched_y; 
boolean touched = false; 

@Override public boolean onTouchEvent(MotionEvent event) { 
    touchCounter++; 
    touched_x = event.getX(); 
    touched_y = event.getY(); 
    int action = event.getAction(); 
    switch (action) { 
        case MotionEvent.ACTION_DOWN: 
            touched = true; 
            break; 
        case MotionEvent.ACTION_MOVE: 
            touched = true; 
            break; 
        case MotionEvent.ACTION_UP: 
            touched = false; 
            break; 
        case MotionEvent.ACTION_CANCEL: 
            touched = false; 
            break; 
        case MotionEvent.ACTION_OUTSIDE: 
            touched = false; 
            break; default: 
    } 
    return true; 
}    

【讨论】:

    【解决方案2】:

    一个最小的例子:

    public class CustomButton extends ImageButton {
    
        public CustomButton(Context context) {
            super(context);
            init();
        }
    
        public CustomButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init()  {
            this.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(getClass().getSimpleName(), "ButtonPressed");
                }
            });
        }
    }
    

    他们的布局:

    <com.example.bossb.test.CustomButton
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    对我来说很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多