我的问题是 - 当我点击<Switch>
时,它会先切换,然后调用OnCheckedChangeListener
。
我想要的是:
点击 <Switch>
- &gt;我展示了一个AlertDialog - &gt;如果按是或否 - >然后使用setChecked(boolean)翻转`,如果按下则为[boolean = true,如果按下否则为false]。
问题:点击<Switch>
后,它会自动翻转。我想首先使用AlertDialog中的yes或no来限定它。
sw_enableDisable
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
getActivity());
alertDialogBuilder
.setMessage(
"Sure you want to enable?. ")
.setCancelable(true)
.setPositiveButton(
getString("YES"),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
})
.setNegativeButton(
getString("NO"),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
sw_enDis_alreadyClicked = true;
} else {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
getActivity());
alertDialogBuilder
.setMessage(
"Sure you want to disable?")
.setCancelable(true)
.setPositiveButton(
getString("YES"),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
})
.setNegativeButton(
getString("NO"),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
});
答案 0 :(得分:4)
试试这段代码。它对我有用:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
Switch switchButton = (Switch) findViewById(R.id.my_switch_id);
switchButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Switch btn = (Switch) v;
final boolean switchChecked = btn.isChecked();
if (btn.isChecked()) {
btn.setChecked(false);
} else {
btn.setChecked(true);
}
String message = "Are you sure you want to disable this setting?";
if (!btn.isChecked()) {
message = "Are you sure you want to enable this setting?";
}
AlertDialog.Builder builder = new AlertDialog.Builder(this); // Change "this" to `getActivity()` if you're using this on a fragment
builder.setMessage(message)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
// "Yes" button was clicked
if (switchChecked) {
btn.setChecked(true);
} else {
btn.setChecked(false);
}
}
})
.setNegativeButton("Cancel", null)
.show();
}
});
答案 1 :(得分:1)
尝试使用onClick:
switch.setOnClickListener(new OnCLickListener(){
Here_is_createing_of_dialog...
dialogBuilder.setPositiveButton(
getString("YES"),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
switch.setChecked(true);
})
});
答案 2 :(得分:1)
使用以下更新的代码。
sw_enableDisable
.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (toogledProgrammatically) {
toogledProgrammatically = false;
} else {
if (isChecked) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
MainActivity.this);
alertDialogBuilder
.setMessage(
"Sure you want to enable?. ")
.setCancelable(true)
.setPositiveButton(
"YES",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
})
.setNegativeButton(
"NO",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
toogledProgrammatically = true;
sw_enableDisable.toggle();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
} else {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
MainActivity.this);
alertDialogBuilder
.setMessage(
"Sure you want to disable?")
.setCancelable(true)
.setPositiveButton(
"YES",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
}
})
.setNegativeButton(
"NO",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
toogledProgrammatically = true;
sw_enableDisable.toggle();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
}
});
因此,每当用户点击No
的{{1}}时,您都应该使用
AlertDialog
但是这会反过来调用sw_enableDisable.toggle();
,然后它会再次循环。因此,为了处理这个问题,请保留一个布尔值onCheckedChanged()
,并在您在代码中切换它时将其设置为toogledProgrammatically
。然后在调用true
时,只需检查它是否以编程方式切换。如果是,则不要做任何事情,否则显示警报。
onCheckedChanged()
答案 3 :(得分:1)
通过设置回状态来防止切换。
Switch switchButton=(Switch)rootView.findViewById(R.id.switch_id);
switchButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Switch btn=(Switch)v;
final boolean estado=btn.isChecked();
if(btn.isChecked())btn.setChecked(false);
else btn.setChecked(true);
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
if(estado)btn.setChecked(true);
else btn.setChecked(false);
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
String message="Disable function?";
if(!btn.isChecked()) message="Enable function?";
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(message).setPositiveButton("YES", dialogClickListener)
.setNegativeButton("NO", dialogClickListener).show();
}
});
答案 4 :(得分:1)
拦截触摸事件将解决问题。如果不想将事件发送到系统,则返回TRUE。我提出了以下方法。 经过测试,按预期工作。
users_jobs