我正在寻找一种使用switch.setChecked(true);
以编程方式更改Android Switch小部件状态而不触发OnCheckedChangedlistener
的方法。
我的第一个想法是将它换成OnClickListener
,但因为这只记录点击次数,你不仅可以点击而且还可以滑动一个Switch然后它不适合用途,就像用户将Switch从关闭滑到开启一样那么Switch实际上什么都不做,因为用户没有点击......
如果有人为此获得解决方案或聪明的工作,那将是非常棒的
好吧,就在使用交换机进行代码处理之前,您可以取消注册监听器,然后执行您需要的任何操作,并再次注册监听器。
在调用setCheck()函数之前将侦听器设置为null,并在此之后启用它,如下所示:
switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);
我有一个解决方案,它在我的工作正常。我在我的开关控件上添加了setOnTouchListener和setOnCheckedChangeListener,并添加了以下代码来解决我的问题。
// set tag by default.
mMySwitch.setTag("TAG");
// Add OnCheckedChangeListener.
mMySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mMySwitch.getTag() != null) {
mMySwitch.setTag(null);
return;
}
// Do your stuff here.
}
});
// Add Touch listener.
mMySwitch.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mMySwitch.setTag(null);
return false;
}
});
这样,只有当通过拖动,点击,触摸进行人为干预,才会调用setOnCheckedChangeListener。
当您尝试更改切换控件的检查状态时,也不要忘记添加有效的字符串标记(非空)。喜欢 :
mMySwitch.setTag("TAG");
mMySwitch.setChecked(true);
编写自定义Switch或SwitchCompat并覆盖setOnCheckedListener。
public class SwitchCompat extends android.support.v7.widget.SwitchCompat {
private boolean mIgnoreCheckedChange = false;
public SwitchCompat(Context context) {
super(context);
}
public SwitchCompat(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) {
super.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mIgnoreCheckedChange) {
return;
}
listener.onCheckedChanged(buttonView, isChecked);
}
});
}
public void setChecked(boolean checked, boolean notify) {
mIgnoreCheckedChange = !notify;
setChecked(checked);
mIgnoreCheckedChange = false;
}
}
每个CompoundButton(两个状态按钮 - 开/关)都有一个按下状态,只有当用户按下视图时才会出现这种状态。
在启动实际逻辑之前,只需在监听器中添加一个检查:
if(compoundButton.isPressed()) {
// continue with your listener
}
这样,以编程方式更改已检查的值将不会触发不需要的代码。
来自@krisDrOid回答。
阐述Mahmoud的答案
CompoundButton.OnCheckedChangeListener switchListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
switchListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//Implement on check change
}
};
switch.setOnCheckedChangeListener (switchListener);
//When you want to trigger the checked of switch do the following
switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (switchListener);
}
`
只需将其添加到您的代码中:
activity.recreate();