如何在不影响onCheckedChangeListener中的onCheckedChanged()的情况下以编程方式打开/关闭compount按钮

时间:2014-12-05 06:33:17

标签: android oncheckedchanged

我在我的应用中使用CompoundButton。我在newsLetterUpdate()的{​​{1}}回调中调用了一个名为onCheckedChange()的方法。我以编程方式更改了此CompoundButton.OnCheckedChangeListener的已检查状态,但调用了CompoundButton回调。我希望仅当我在onCheckedChange()上切换选中状态时才会触发onCheckedChange()。 如果没有调用View回调,请建议我改变复合按钮状态的解决方案。

5 个答案:

答案 0 :(得分:2)

因此,根据您的要求,我认为只有在用户启动操作时才需要执行onCheckedChange()内部的代码回调。正确?

那你为什么要使用onCheckedChange(),你可以使用onClickListener()来实现目标。

目前您可能已编写代码:

compundbutton.setOnCheckedChangeListener(your_current_listener);

将代码从那里移到:

compundbutton.setOnClickListener(your_new_listener);

然后,在程序设置检查状态时,不会调用onCheckedChange ()个侦听器。

compundbutton.setChecked(checked);

希望它可以帮助你......! :)

答案 1 :(得分:1)

我有类似的问题。我有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。希望这会有所帮助。

答案 2 :(得分:0)

方法1 :如果您想要checkChangeListener只应在使用与视图交互时调用,那么在该类中实现onClickListener put newsLetterUpdate方法< / p>

Mehtod 2 :在编程更改复选框之前取消注册侦听器,并在完成后再次注册

方法3 :使用布尔标志...当你在程序上更改复选框时设置它,并在你完成时设置为false ...用你要执行的那个标志保护代码仅限用户互动

答案 3 :(得分:0)

方法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 。当用户更改了合并按钮的状态时,Android会调用 setChecked

请注意,我正在使用一个扩展了compund按钮的开关,你可以在任何其他代码上使用基本相同的代码(复选框,...)

答案 4 :(得分:0)

您可以检查onCheckedChange事件是否来自用户按下按钮,是否检查isPressing值,如下所示:

switch.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener {

            override fun onCheckedChanged(switch: CompoundButton?, checked: Boolean) {
                if (switch == null) {
                    return
                }
                if (switch.isPressed) {
                    viewModel.onCheckedChanged(checked)
                }
            }

        })