3

我在我的应用程序中使用 a CompoundButton。我调用了一个newsLetterUpdate()onCheckedChange()回调中命名的方法CompoundButton.OnCheckedChangeListenerCompoundButton我以编程方式更改了此检查的状态,但onCheckedChange()调用了回调。我希望onCheckedChange()仅当我在View. 请建议我一个解决方案来更改复合按钮的状态而不onCheckedChange()调用回调。

4

5 回答 5

4

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

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

目前你可能已经在里面写了你的代码:

compundbutton.setOnCheckedChangeListener(your_current_listener);

将该代码从那里移动到:

compundbutton.setOnClickListener(your_new_listener);

然后onCheckedChange ()侦听器将不会在以编程方式设置检查状态时被调用。

compundbutton.setChecked(checked);

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

于 2014-12-05T07:10:48.530 回答
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。希望这会有所帮助。

于 2018-02-23T15:58:19.440 回答
0

方法 1:如果你只想在checkChangeListener使用与视图交互时调用 on,那么在该类中实现onClickListenerput方法newsLetterUpdate

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

方法3:使用布尔标志...当您以编程方式更改复选框时设置它,并在您完成时设置如果为假...用您只想通过用户交互执行的标志保护代码

于 2014-12-05T06:37:01.870 回答
0

方法四:使用自定义视图

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

请注意,我使用的是扩展复合按钮的开关,您可以在任何其他(复选框,...)上使用基本相同的代码

于 2015-04-15T20:55:37.120 回答
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)
                }
            }

        })
于 2019-02-27T10:45:16.327 回答