4

这不是什么大问题,但我正在尝试找到正确的方法。

我有以下情况:

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使用错误设置初始化,我将其更改为 true 确实是一个CheckedChanged事件。

我当然可以在设置初始值后更改顺序并分配侦听器,但是有没有办法在以某种方式传递各种组件的初始值的同时扩大布局?它们是动态的,因此我无法将值固定为 settings.xml 中的特定值

干杯

4

6 回答 6

6

上面的建议很好,但是在一个checkable ListView中还是存在这个问题。我是这样解决的:禁用监听器,设置检查状态,然后再次设置监听器。这是一个辅助函数:

private void checkCheckBox(CheckBox checkBox, boolean checked) {
    checkBox.setOnCheckedChangeListener(null);
    checkBox.setChecked(checked);
    checkBox.setOnCheckedChangeListener(this);
}
于 2013-03-27T12:59:03.813 回答
4

你已经回答了你自己的问题,这setChecked(true)是导致OnCheckedChangeListener被调用的原因。

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

于 2013-01-10T13:53:40.893 回答
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;            
    }
}

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

于 2013-01-10T14:18:43.877 回答
1

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

于 2013-01-10T13:39:26.447 回答
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 小部件一起使用)

于 2015-04-16T13:44:55.573 回答
0

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

public void setCheckedNoEvent(boolean checked) {
    if (onCheckedChangeListener == null) {
        switcher.setChecked(checked);
    } else {
        switcher.setOnCheckedChangeListener(null);
        switcher.setChecked(checked);
        switcher.setOnCheckedChangeListener(OnCheckedChangeListener);
    }
}
于 2016-08-19T04:12:31.697 回答