【问题标题】:How to do onBackPress dialog in fragment in android?如何在android的片段中执行onBackPress对话框?
【发布时间】:2015-04-11 12:45:43
【问题描述】:

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

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

但是,目前我想将类切换到 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()

【问题讨论】:

  • 错误是什么?如果您将onDetach 替换为onBackPressed,它会起作用吗?编辑看看我发现了什么link 有帮助吗?
  • onBackPressed 无法处理按菜单选项卡和更改选项卡的情况
  • 如果你尝试使用setKeyListenerOnViewthis 这样呢?
  • 这意味着我需要单独处理此案(1. backpress 2.on Menu tab click )?我也更新了问题,谢谢

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


【解决方案1】:

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

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

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

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

  1. 使用方法boolean consumeBackPress();创建BackNavigable之类的接口(由那些想消费回压的片段实现)
  2. 对于那些希望使用后按事件的 Fragment,从实现中返回 true。

就是这样。

【讨论】:

  • 非常感谢,当我按下菜单标签栏时,标签会发生变化吗?
  • 对于选项卡,您必须使用子 Fragment Manager 而不是 FragmentManager 来实现相同的逻辑。
  • 对于支持库,它必须 getSupportFragmentManager()
猜你喜欢
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多