我有一个switch
按钮(实际上是一个自定义按钮),出于某种原因我想禁用滑动功能;我希望用户只能单击它。有没有办法做到这一点?谢谢。
问问题
48721 次
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 回答