复选框默认值& OnCheckedChangeListener

时间:2013-01-10 13:36:39

标签: android checkbox oncheckedchanged

这不是一个问题,但我正在努力寻找一种正确的方法。

我有以下情况:

public class SettingsDialogFragment extends DialogFragment implements OnCheckedChangeListener {

...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.settings, container);

    ...

    CheckBox lBox1  = (CheckBox)view.findViewById(R.id.checkBox1);

    lBox1.setOnCheckedChangeListener(this);
    lBox1.setChecked(true);

    return view;
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    ....

}

我遇到的“问题”是,通过调用setChecked(true),onCheckChanged将会触发。我想当我给布局充气时 - CheckBox初始化为false设置,而我将其更改为true确实是CheckedChanged事件。

我当然可以在设置初始值后改变顺序并分配监听器,但有没有办法给布局充气,同时以某种方式传递各种组件的初始值?它们是动态的,因此我无法将值修复为settings.xml

中的特定值

干杯

6 个答案:

答案 0 :(得分:6)

上述建议很好,但这个问题仍然存在于可检查的ListView中。我用这种方式解决了它:禁用监听器,设置检查状态,然后再次设置监听器。这是一个辅助函数:

private void checkCheckBox(CheckBox checkBox, boolean checked) {
    checkBox.setOnCheckedChangeListener(null);
    checkBox.setChecked(checked);
    checkBox.setOnCheckedChangeListener(this);
}

答案 1 :(得分:4)

您已回答了自己的问题,setChecked(true)导致OnCheckedChangeListener被调用。

一个简单的解决方法是将android:checked="true"添加到CheckBox XML声明中并省略setChecked(true)调用。

答案 2 :(得分:3)

CheckBox的代码如下所示:

public void setChecked(boolean checked) {
    if (mChecked != checked) {
        mChecked = checked;
        refreshDrawableState();

        // Avoid infinite recursions if setChecked() is called from a listener
        if (mBroadcasting) {
            return;
        }

        mBroadcasting = true;
        if (mOnCheckedChangeListener != null) {
            mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
        }
        if (mOnCheckedChangeWidgetListener != null) {
            mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
        }

        mBroadcasting = false;            
    }
}

所以基本上你不能在没有触发事件的情况下使用该方法,除非您之前删除或禁用事件处理程序(或仅在之后设置它们)。

答案 3 :(得分:1)

如果您只想设置初始值,那么您的第一个建议可能是最好的:只需在初始化所有内容后注册听众。

答案 4 :(得分:0)

解决方案是 OnTouchListener 。默认情况下,您不设置OnCheckedChangeListener。你要做的是以下几点:

**declared in the class object declaration**:
OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            **have fun**
        }
    };

**used to the point you would have set the OnCheckedChangeListener**
anyView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                anyUsableView.setOnCheckedChangeListener(onCheckedChangeListener);

                return false;
            }
        });

对OnTouchListener返回false非常重要,否则视图将不再起作用。

提示:此解决方案可以与任何适合它的侦听器一起使用(我将它与Switch小部件一起使用)

答案 5 :(得分:0)

我想解决方案可能是一个setChecked()函数,它在设置检查值之前将侦听器分离。

public void setCheckedNoEvent(boolean checked) {
    if (onCheckedChangeListener == null) {
        switcher.setChecked(checked);
    } else {
        switcher.setOnCheckedChangeListener(null);
        switcher.setChecked(checked);
        switcher.setOnCheckedChangeListener(OnCheckedChangeListener);
    }
}