Java 动态选中onClickListener中的复选框
所以,我有一个复选框。选中此复选框时,我不希望该框立即选中。我弹出一个对话框,要求用户“标记为完成/不完整”或“取消”。只有当用户选择“标记为完整/不完整”时,我才希望复选框切换。但是,每当我单击此选项时,对话框就会重新出现,并且复选框不会切换。我不确定我在这里做错了什么。这是我的密码:Java 动态选中onClickListener中的复选框,java,android,checkbox,android-checkbox,Java,Android,Checkbox,Android Checkbox,所以,我有一个复选框。选中此复选框时,我不希望该框立即选中。我弹出一个对话框,要求用户“标记为完成/不完整”或“取消”。只有当用户选择“标记为完整/不完整”时,我才希望复选框切换。但是,每当我单击此选项时,对话框就会重新出现,并且复选框不会切换。我不确定我在这里做错了什么。这是我的密码: package com.example.testcheckbox; import android.app.AlertDialog; import android.content.DialogInterface
package com.example.testcheckbox;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.CheckBox;
import android.widget.CompoundButton;
public class MainActivity extends ActionBarActivity {
CheckBox cb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cb = (CheckBox) findViewById(R.id.checkbox);
cb.setChecked(true);
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
final boolean isChecked) {
CharSequence options[];
if (isChecked) {
cb.setChecked(false);
options = new CharSequence[] { "Mark as Complete",
"Cancel" };
} else {
cb.setChecked(true);
options = new CharSequence[] { "Mark as Incomplete", "Cancel" };
}
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
cb.toggle();
}
}
});
builder.show();
}
});
}
}
下面是带有复选框的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.testcheckbox.MainActivity" >
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
有什么想法吗?如果你不明白我想做什么,就问吧!谢谢问题在于,如果您通过
切换
或设置选中
来更改复选框
的选中状态,它将再次调用复合按钮
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.CompoundButton;
public class MyActivity extends ActionBarActivity {
private CheckBox cb;
boolean isShowing = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
cb = (CheckBox) findViewById(R.id.checkbox);
cb.setChecked(true);
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
final boolean isChecked) {
if(!isShowing) {
isShowing = true;
CharSequence options[];
if (isChecked) {
cb.setChecked(false);
options = new CharSequence[]{"Mark as Complete",
"Cancel"};
} else {
cb.setChecked(true);
options = new CharSequence[]{"Mark as Incomplete", "Cancel"};
}
AlertDialog.Builder builder = new AlertDialog.Builder(
MyActivity.this);
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
cb.toggle();
dialog.cancel();
break;
case 1:
dialog.cancel();
}
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
isShowing = false;
}
});
builder.show();
}
}
});
}
}
请试试这个
package com.example.testcheckbox;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.CheckBox;
import android.widget.CompoundButton;
public class MainActivity extends ActionBarActivity {
CheckBox cb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cb = (CheckBox) findViewById(R.id.checkbox);
cb.setChecked(true);
cb.setOnCheckedChangeListener(mOnCheckedChangeListener);
}
private CompoundButton.OnCheckedChangeListener mOnCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, final boolean isChecked) {
CharSequence options[];
if (isChecked) {
cb.setChecked(false);
options = new CharSequence[] { "Mark as Complete", "Cancel" };
} else {
cb.setChecked(true);
options = new CharSequence[] { "Mark as Incomplete", "Cancel" };
}
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0: {
cb.setOnCheckedChangeListener(null);
cb.toggle();
cb.setOnCheckedChangeListener(mOnCheckedChangeListener);
}
}
}
});
builder.show();
}
};
}
cb.toggle();将调用OnCheckedChangeListener,这就是警报重新出现的原因。因此在此期间,必须将OnCheckedChangeListener设置为null。然后重置。@Krish说得通,关于如何将侦听器设置为null并重置它的任何帮助?这似乎只适用于复选框的第一个复选框。如果尝试重新检查,则不会显示对话框