开关按钮,禁用点击后更改状态

3
我想要使用一个开关按钮,但我希望在点击时禁用状态的更改,只允许拖动选项。我尝试设置onclick监听器不执行任何操作,但当我单击按钮时总是会更改状态。

是否有人知道如何禁用onClick更改状态?


使用button.setClickable(false)。 - Ahmad Raza
但是如果我设置了clickable(false),我就无法拖动开关。 - bott
你可以使用onTouch事件来实现拖动... - Ahmad Raza
如果我将clickable设置为false,那么ontouch事件只会接收到action_down事件。 - bott
5个回答

3
如果您想通过滑动仅更改开关的状态,请按照以下步骤进行操作:
 switchbutton = view.findViewById(R.id.switch2);
    switchbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switchbutton.setChecked(!switchbutton.isChecked());
        }
    });

1
使用开关小部件,您需要创建customSwitch类并覆盖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。


在该方法中,x未被初始化。应该在哪里初始化x,并将其默认值设置为什么? - Akash Raghav

0
//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());

}

这对我有用。在我的情况下,点击切换按钮会向服务发送请求,如果服务回复“OK”,则消息处理程序将设置切换按钮的正确状态。


0
4年后,我找到了一个非常干净和易于使用的解决方案,适用于这种情况:
创建您自己的开关并覆盖performClick()方法,这部分允许避免CompoundButton在单击时做出反应:
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"

-1

使用切换按钮代替按钮

用于切换按钮的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
        }
    }
});

我正在使用开关按钮而不是普通按钮。我想在单击事件中禁用状态更改函数,仅允许该函数在拖动事件中发生。 - bott
你可以将其用于开关按钮。 - Kaushik
是的,但问题仍然存在,当您单击按钮时,该按钮会更改其状态(on->off,off->on),然后进入该函数(在这种情况下为onToggleClicked)。我想防止/消除单击时的状态更改。 - bott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接