切换按钮,禁用更改状态onclick



我想使用一个开关按钮,但是我想在单击时禁用更改状态,让此更改仅对拖动选项。我尝试将onclick侦听器设置为什么都不做,但是当我单击按钮时,请始终更改状态。

有人知道禁用更改状态onClick

如果您只想用Swipe更改 switch的状态进行以下操作:

 switchbutton = view.findViewById(R.id.switch2);
    switchbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switchbutton.setChecked(!switchbutton.isChecked());
        }
    });

使用开关小部件,您将必须创建自定义工程师类,并覆盖OnTouchEvent方法,以返回true当您检测到一个单击时:

public boolean onTouchEvent(MotionEvent ev) {
    boolean response;
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            x = ev.getX();
            response = super.onTouchEvent(ev);
            break;
        case MotionEvent.ACTION_UP:
            response = Math.abs(x - ev.getX()) <= 10 || super.onTouchEvent(ev);
            break;
        default:
            response = super.onTouchEvent(ev);
            break;
    }
    return response;
}

数字10是公差值,因为某些设备报告了3或6个像素左右的运动事件,而不是单击,因此您可以控制:10个像素或更少的单击(并忽略它)或更多距离考虑运动并让这种运动通过了正常的转换行为。

将X声明为类级变量,默认值为0。首先调用MotionEvent.Action_Down,因此您将在MotionEvent的X轴上具有X。

//onClickListener
public void tglOnClick(View v) {
    ToggleButton tgl = (ToggleButton) v;
    //do something based on toggle status after clicking
    if (tgl.isChecked())
        //do something
    else
        //do something else
    //revert button state so that it can be controlled by some external logic
    tgl.setChecked(!tgl.isChecked());

}

这对我有用。在我的情况下,单击"切换"按钮将请求发送到服务,如果服务回复了"确定",则消息处理程序设置了切换按钮的正确状态。

4年后发现解决方案非常干净,容易容易:

创建自定义开关和覆盖PerformClick(),该部分允许避免在单击时进行反应:

class CustomSwitch @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : SwitchMaterial(context, attrs, defStyleAttr) {
    override fun performClick(): Boolean {
        return false
    }
}

第二部分是禁止TextView继承在单击时进行反应,为此只需将其添加到您的XML:

android:textIsSelectable="false"

使用切换按钮而不是Button

XML用于切换按钮

<ToggleButton 
    android:id="@+id/togglebutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

在Java类中

ToggleButton toggle = (ToggleButton) findViewById(R.id.togglebutton);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // The toggle is enabled
        } else {
            // The toggle is disabled
        }
    }
});

最新更新