【问题标题】:Checkbox default value & OnCheckedChangeListener复选框默认值 & OnCheckedChangeListener
【发布时间】:2013-01-10 13:36:38
【问题描述】:

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

我有以下情况:

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 中的特定值

干杯

【问题讨论】:

    标签: android checkbox oncheckedchanged


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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;            
            }
        }
        

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

        【讨论】:

        • 这基本上回答了我的问题。谢谢。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          解决方案是 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 的 return false 很重要,否则视图将无法正常工作。

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 2012-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-03-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多