如何在android中的片段中进行onBackPress对话框?

时间:2015-02-11 08:09:31

标签: android android-fragments android-lifecycle android-event onbackpressed

我正在创建一个弹出的对话框,以确认用户是否退出该页面。

过去我使用过这个活动,所以没有问题。我只需将对话框放在覆盖onBackPress函数中,如果用户选择离开,则调用finish()

但是,目前我想将类切换到tabhost中的片段。因此,我不仅需要处理onbackpress,还需要处理用户单击Tab栏切换到其他选项卡的情况。

我试过了:

@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()

1 个答案:

答案 0 :(得分:2)

您需要在Activity中覆盖onBackPressed()。并且在提交之前使所有FragmentTransaction都是addToBackStack。

 @Override public void onBackPressed() {
     int count = getFragmentManager().getBackStackEntryCount();

     if (count == 0) {
         super.onBackPressed();
         //additional code
     } else {
         getFragmentManager().popBackStack();
     }
 }

虽然上述方法适用于添加到后栈的所有片段。您也可以自定义它以遵循模式。

  1. 使用方法boolean consumeBackPress();
  2. 创建一个界面,例如BackNavigable(由那些想要反馈的片段实现)
  3. 对于那些想要消费的片段,新闻事件从实现中返回true。
  4. 现在内部活动onBackPressed()查看当前片段并检查该片段是否是BackNavigable的实例并在其consumeBackPress()实现中返回true,如果是,则弹出该片段,否则调用super.onBackPressed()个活动
  5. 就是这样。