如何在 android 片段中执行 onBackPress 对话框?
How to do onBackPress dialog in fragment in android?
我正致力于创建一个弹出对话框以确认用户是否退出页面。
以前我用的是activity所以没问题。我只需要将对话框放在覆盖 onBackPress
函数中,如果用户选择离开,则调用 finish()
。
但是,目前我想将 class 切换为 tabhost 内的片段。因此,不仅我需要处理 onbackpress,还需要处理用户点击标签栏切换到其他标签的情况。
我试过了:
@Override
public void onDetach() {
AlertDialog.Builder builder = new Builder(ctx);
builder.setMessage(getResources().getString(R.string.quit_form));
builder.setNegativeButton(getResources().getString(R.string.yes),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
File directory = new File(Constant.upload_imageFolder);
File[] files = directory.listFiles();
for (int i = 0; i < files.length; ++i) {
files[i].delete();
}
UploadForm.super.onDetach();
}
});
builder.setPositiveButton(getResources().getString(R.string.no),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
但是它崩溃了。如何解决这个问题?并且 onDetach 是要覆盖的正确函数吗?非常感谢。
更新:
ondetach时的异常:
android.support.v4.app.SuperNotCalledException: Fragment UploadForm{42db9eb0 #3 id=0x7f050075} did not call through to super.onDetach()
您需要重写 Activity 中的 onBackPressed()。并使所有的 FragmentTransaction 在提交之前都是 addToBackStack。
@Override public void onBackPressed() {
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
//additional code
} else {
getFragmentManager().popBackStack();
}
}
虽然上述方法适用于添加到后台堆栈的所有片段。您还可以自定义它以遵循某种模式。
- 创建一个接口,例如 BackNavigable(由那些想要使用后退键的片段实现),使用方法
boolean consumeBackPress();
- 对于那些想要从实现中消耗回按事件 return true 的片段。
- 现在在 activity onBackPressed() 中查看当前片段并检查该片段是否是 BackNavigable 的实例并且在其
consumeBackPress()
实现中具有 return true,如果是则弹出该片段片段否则调用 activity. 的 super.onBackPressed()
就这些了。
我正致力于创建一个弹出对话框以确认用户是否退出页面。
以前我用的是activity所以没问题。我只需要将对话框放在覆盖 onBackPress
函数中,如果用户选择离开,则调用 finish()
。
但是,目前我想将 class 切换为 tabhost 内的片段。因此,不仅我需要处理 onbackpress,还需要处理用户点击标签栏切换到其他标签的情况。
我试过了:
@Override
public void onDetach() {
AlertDialog.Builder builder = new Builder(ctx);
builder.setMessage(getResources().getString(R.string.quit_form));
builder.setNegativeButton(getResources().getString(R.string.yes),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
File directory = new File(Constant.upload_imageFolder);
File[] files = directory.listFiles();
for (int i = 0; i < files.length; ++i) {
files[i].delete();
}
UploadForm.super.onDetach();
}
});
builder.setPositiveButton(getResources().getString(R.string.no),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
但是它崩溃了。如何解决这个问题?并且 onDetach 是要覆盖的正确函数吗?非常感谢。
更新: ondetach时的异常:
android.support.v4.app.SuperNotCalledException: Fragment UploadForm{42db9eb0 #3 id=0x7f050075} did not call through to super.onDetach()
您需要重写 Activity 中的 onBackPressed()。并使所有的 FragmentTransaction 在提交之前都是 addToBackStack。
@Override public void onBackPressed() {
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
//additional code
} else {
getFragmentManager().popBackStack();
}
}
虽然上述方法适用于添加到后台堆栈的所有片段。您还可以自定义它以遵循某种模式。
- 创建一个接口,例如 BackNavigable(由那些想要使用后退键的片段实现),使用方法
boolean consumeBackPress();
- 对于那些想要从实现中消耗回按事件 return true 的片段。
- 现在在 activity onBackPressed() 中查看当前片段并检查该片段是否是 BackNavigable 的实例并且在其
consumeBackPress()
实现中具有 return true,如果是则弹出该片段片段否则调用 activity. 的
super.onBackPressed()
就这些了。