我在我的应用程序中使用了CompoundButton
。我在newsLetterUpdate()
的onCheckedChange()
回调中调用了一个名为CompoundButton.OnCheckedChangeListener
的方法。我以编程方式更改此CompoundButton
的已检查状态,但调用onCheckedChange()
回调。我希望只有当我在onCheckedChange()
上切换检查状态时才会触发View
。请建议我一个解决方案来改变复合按钮的状态,而不调用onCheckedChange()
回调。
因此,根据您的要求,我认为只有在用户启动操作时才需要执行onCheckedChange()
回调内的代码。对?
那你为什么使用onCheckedChange()
,你可以使用onClickListener()
来实现你的目标。
目前你可能在里面写了你的代码:
compundbutton.setOnCheckedChangeListener(your_current_listener);
将该代码从那里移到:
compundbutton.setOnClickListener(your_new_listener);
然后onCheckedChange ()
监听器将不会在程序设置检查状态时被调用。
compundbutton.setChecked(checked);
希望它可以帮助你..! :)
我有类似的问题。我有RadioGroup,当用户打开应用程序时,我正在设置初始状态,它在OnCheckedChangeListener中进行,在我的情况下是更新数据库中的数据非常糟糕。我已经解决了这个问题,在OnCheckedChangedListener中我正在按下按钮并在该方法中设置一个OnClickListener:
viberPermissionView.getAppPermissions().setOnCheckedChangeListener(
new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup,
int checkedRadioButtonId) {
final RadioButton checkedButton =
viberPermissionView.findViewById(checkedRadioButtonId);
checkedButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startService(checkedButton,
App.VIBER);
}
});
}
});
有了这个,当onCreate被调用时,它进入OnCheckedChangedListener,但它没有进入OnClickListener。只有当用户按下按钮时,它才会进入OnClick并在我的情况下执行startService。希望这会有所帮助。
方法1:如果你想在checkChangeListener
上只应该在使用时与视图交互,那么实现onClickListener
将newsLetterUpdate
方法放在该类中
方法2:在以编程方式更改复选框之前取消注册侦听器,并在完成后再次注册
方法3:使用布尔标志...当您在程序上更改复选框时设置它并在完成时设置为false ...使用该标志保护代码,仅使用用户交互执行
方法4:使用自定义视图
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Switch;
public class CustomSwitch extends Switch {
private OnCheckedChangeListener mListener;
public CustomSwitch(Context context) {
super(context);
}
public CustomSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
// Do not call supper method
mListener = listener;
}
@Override
public void setChecked(boolean checked) {
super.setChecked(checked);
if (mListener != null) {
mListener.onCheckedChanged(this, checked);
}
}
public void setCheckedProgrammatically(boolean checked) {
// You can call super method, it doesn't have a listener... he he :)
super.setChecked(checked);
}
}
示例XML用法
<com.your.package.CustomSwitch
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
现在的想法是在代码中调用setCheckedProgrammatically方法。当用户更改compund按钮的状态时,Android会调用setChecked
请注意,我正在使用一个扩展复合按钮的开关,你可以在任何其他代码上使用基本相同的代码(复选框,......)
您可以检查onCheckedChange事件是否来自用户按下按钮,如果您检查isPressing值如下:
switch.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener {
override fun onCheckedChanged(switch: CompoundButton?, checked: Boolean) {
if (switch == null) {
return
}
if (switch.isPressed) {
viewModel.onCheckedChanged(checked)
}
}
})