这不是一个问题,但我正在努力寻找一种正确的方法。
我有以下情况:
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
中的特定值干杯
答案 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);
}
}