【问题标题】:Android CheckBox callback fromUserAndroid CheckBox 回调 fromUser
【发布时间】:2016-05-11 06:19:09
【问题描述】:

有没有办法检查用户是否检查了CheckBox

private android.widget.CheckBox.OnCheckedChangeListener checkboxListener = new android.widget.CheckBox.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    }

更新

我通过实现自定义 CheckBox 类来解决这个问题,该类包装 CheckBox 并保存来自User 的布尔值,还实现了自定义侦听器,并重载 setChecked(boolean checked, boolean fromUser)。

`public class PaCheckBox 扩展 CheckBox {

private static boolean fromUser;

public PaCheckBox(Context context) {
    super(context);
}

public PaCheckBox(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public PaCheckBox(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public void setChecked(boolean checked, boolean fromUser){
    setChecked(checked);
    PaCheckBox.fromUser = fromUser;
}

@Override
public void setChecked(boolean checked) {
    super.setChecked(checked);
    PaCheckBox.fromUser = true;
}

@Override
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
    super.setOnCheckedChangeListener(listener);
}

public static class PaOnCheckBoxChangeListener implements android.widget.CheckBox.OnCheckedChangeListener {



    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked, boolean fromUser) {

    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        onCheckedChanged(buttonView,isChecked,PaCheckBox.fromUser);
    }
}

} `

【问题讨论】:

  • 您可以使用checkBox.isChecked();获取检查状态
  • 我不想要CheckBox的状态,我想得到如果它是由用户触发的,通过调用SetChecked(),isChecked为真

标签: android checkbox android-checkbox


【解决方案1】:

onCheckedChanged() 中的boolean isChecked 正好代表了这一点。如果它的true 则选中CheckBox,如果false 则未选中。

private android.widget.CheckBox.OnCheckedChangeListener checkboxListener = new android.widget.CheckBox.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(isChecked)
            // user has check the checkbox
        else
           // user has uncheck it
}

From official document

 public abstract void onCheckedChanged (CompoundButton buttonView, boolean isChecked)

当复合按钮的选中状态发生变化时调用。

参数

buttonView - 状态已更改的复合按钮视图。

isChecked - buttonView 的新检查状态。

注意:我强烈建议您在寻求帮助之前阅读文档以了解您有任何疑问。

【讨论】:

  • 我的意思是,我们可以在初始化时以编程方式触发检查,然后 isChecked 将为真,但我想跟踪用户是否按下了检查或取消检查
  • @Arman:这就是为什么你可以使用这个回调方法,看看isChecked是真还是假。如果为真,则用户已检查CheckBox,如果为假,则用户已取消选中。
  • 我猜你没有得到问题 :) 我不想要 CheckBox 的状态,我想通过调用 SetChecked() 来获取用户触发的状态,isChecked 为真跨度>
  • @Arman:你真的应该更新这个问题。在这里,您将找到如何做到这一点。 stackoverflow.com/questions/9129858/…
  • @Arman:不是我发布链接的那个吗?如果它对你有用,那好吧。
【解决方案2】:
private android.widget.CheckBox.OnCheckedChangeListener checkboxListener = new android.widget.CheckBox.OnCheckedChangeListener() {
    @Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
 {
      if(isChecked)
      {


> do what ever you want


       }
}

【讨论】:

  • 我猜你没有得到问题 :) 我不想要 CheckBox 的状态,我想通过调用 SetChecked() 来获取用户触发的状态,isChecked 为真跨度>
【解决方案3】:

您将使用正确的代码,您需要放置条件。

    private android.widget.CheckBox.OnCheckedChangeListener checkboxListener = new      android.widget.CheckBox.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(isChecked)
        Log.e("Log","user checked box");
    else
        Log.e("Log","user Unchecked box");
    }

【讨论】:

  • 我猜你没有得到问题 :) 我不想要 CheckBox 的状态,我想通过调用 SetChecked() 来获取用户触发的状态,isChecked 为真跨度>
【解决方案4】:

这样试试,

 checkBox.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (checkBox.isChecked()) {
                    //your code here  
                    //this will be true here by default you need not write checkBox.setChecked(true);
                } else {
                    //not checked by user
                    //this will be false here by default you need not write checkBox.setChecked(false);
                }
            }
        });

【讨论】:

  • 如果复选框被用户选中,而不是从这里调用 setChecked(),你如何获得?
  • 通过恢复复选框的状态并在复选框对象上调用 setChecked(),将触发此侦听器,您希望能够区分用户按下和恢复调用,你明白吗?
  • 你必须存储复选框的状态,当用户按下时,你必须检查状态,逻辑上你必须维护复选框的状态,并且你必须区分用户按下和恢复呼叫@Arman
【解决方案5】:

这是一个有趣的问题,引起了一些混乱。我相信您所要求的类似于 SeekBar fromUser 布尔值,它表示用户是否单击了屏幕或复选框是否已以编程方式更改。 此要求的一个有用示例是在传播带有复选框的列表视图时。由于视图是最新的,因此需要由持有人或通过输入相关数据来设置值。 无论用户是否有意触摸屏幕,都会触发 OnClickListener。而在 SeekBar 的情况下,布尔 fromUser 允许程序员做出选择......就像您对包装器所做的那样。 我是 java 新手,不过,我确信除了你的包装器之外,肯定还有一个解决方案,我还没有找到一个……如果我找到了,我会告诉你的。

【讨论】:

    【解决方案6】:

    只是一个我发现可行的想法,使用 OnClickListener。它仅在用户触摸控件时调用。如果应用更改检查状态,则不会调用它。

        findViewById(R.id.switchFound).setOnClickListener(new View.OnClickListener () {
            @Override
            public void onClick(View v) {
    
                boolean isChecked = ((Switch) v).isChecked();
    
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 2018-04-22
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2011-09-23
      相关资源
      最近更新 更多