28

我有一个switch按钮(实际上是一个自定义按钮),出于某种原因我想禁用滑动功能;我希望用户只能单击它。有没有办法做到这一点?谢谢。

4

7 回答 7

54

您可以 setClickable(false) 到您的 Switch,然后在 Switch 的父级中侦听 onClick() 事件并以编程方式切换它。该开关仍将显示为已启用,但不会发生滑动动画。

...

[在 onCreate() 中]

Switch switchInternet = (Switch) findViewById(R.id.switch_internet);
switchInternet.setClickable(false);

...

[点击监听]

public void ParentLayoutClicked(View v){
    Switch switchInternet = (Switch) findViewById(R.id.switch_internet);

    if (switchInternet.isChecked()) {
        switchInternet.setChecked(false);           
    } else {
        switchInternet.setChecked(true);    
    }       
}

...

[布局.xml]

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:onClick="ParentLayoutClicked"
        android:focusable="false"
        android:orientation="horizontal" >

        <Switch
            android:layout_marginTop="5dip"
            android:layout_marginBottom="5dip"
            android:id="@+id/switch_internet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textOff="NOT CONNECTED"
            android:textOn="CONNECTED"
            android:focusable="false"
            android:layout_alignParentRight="true"                                                
            android:text="@string/s_internet_status" />

    </RelativeLayout>
于 2013-06-19T19:04:26.427 回答
23

更好的方法是阻止 Switch 类接收MotionEvent.ACTION_MOVE事件。

这可以通过以下方式完成:

switchButton.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    return event.getActionMasked() == MotionEvent.ACTION_MOVE;
  }
});

然后,您可以根据需要在开关上自由设置点击侦听器。

查看Switch 的实现以了解拖动的工作原理。它太酷了!

于 2014-01-14T23:12:41.590 回答
12

要禁用 Switch,请使用以下方法

switchBtn.setEnabled(false);

使开关不可点击使用

switchBtn.setClickable(false);

其中 switchBtn 是 Switch 对象

于 2014-01-10T11:45:19.120 回答
5

我的解决方案是:

switchView.setOnTouchListener(new View.OnTouchListener() { 
@Override           
public boolean onTouch(View view, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                            //Your code
                }
                return true;            
    }       
});

或黄油刀:

@OnTouch(R.id.switchView)
public boolean switchStatus(Switch switchView, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        // your code
    }
    return true;
}
于 2015-10-12T11:23:44.157 回答
3

您可以自定义扩展 Switch 的视图,然后覆盖其 onTouchEvent()

@Override
public boolean onTouchEvent(MotionEvent ev) {
    boolean handle = ev.getActionMasked() == MotionEvent.ACTION_MOVE;
    return handle ? handle : super.onTouchEvent(ev);
}

它应该工作。

于 2016-01-20T07:23:51.613 回答
0

使用绑定适配器可以通过这个简单的 Kotlin 扩展来完成:

@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("isSwipeEnabled")
fun SwitchCompat.setSwipeEnabled(isSwipeEnabled: Boolean) {
    setOnTouchListener { _, event ->
        if (isSwipeEnabled)
            false
        else
            event.actionMasked == MotionEvent.ACTION_MOVE
    }
}

然后你可以在这样的布局文件中使用它:

<com.google.android.material.switchmaterial.SwitchMaterial
        android:id="@+id/switch"
        isSwipeEnabled="@{false}"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
于 2022-01-17T15:54:08.267 回答
-1

//这段代码工作正常

公共类 MainActivity 扩展 AppCompatActivity 实现 CompoundButton.OnCheckedChangeListener { Switch my_switch;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    my_switch = (Switch) findViewById(R.id.my_switch);
    my_switch.setOnCheckedChangeListener(this);
}
@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.my_switch:
            if(my_switch.isChecked())
                my_switch.setChecked(true);                
            else           
                my_switch.setChecked(true);
            break;
    }
}

}

于 2017-03-25T18:19:54.870 回答