2013-01-10 152 views
4

这不是一个问题,但我正在尝试找到一个正确的方法来做到这一点。复选框默认值&OnCheckedChangeListener

我有以下情况:

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初始化一个错误的设置,我改变为真的确实是一个CheckedChanged事件。

我当然可以改变顺序,并在设置初始值后分配监听器,但是有没有办法让布局膨胀,同时以某种方式传递各个组件的初始值?他们是动态的,所以我无法修复的值,以一个特定的值在settings.xml

干杯

回答

3

复选框的代码看起来是这样的:

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;    
    } 
} 

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

+0

这基本上回答了我问。谢谢。 – Lieuwe

0

如果你只是想设置的初始值,那么你的第一个建议可能是最好的:后仅注册监听器你已经初始化了一切。

3

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

一个简单的解决将是添加android:checked="true"到您的复选框XML声明,并省略setChecked(true)电话。

6

上面的建议很好,但是这个问题在一个可检查的ListView中依然存在。我通过这种方式解决了这个问题:禁用监听器,设置检查状态,然后再次设置监听器。这里是一个辅助功能:

private void checkCheckBox(CheckBox checkBox, boolean checked) { 
    checkBox.setOnCheckedChangeListener(null); 
    checkBox.setChecked(checked); 
    checkBox.setOnCheckedChangeListener(this); 
} 
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是非常重要的,否则视图将不再工作。

提示:该解决方案可以与任何类型的听众的是有利于它(我使用它与一个开关部件)

0

我猜的解决方案可能是一个setChecked()函数分离使用在设置选中的值之前监听器。

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