0

我正在创建一个对话框,弹出确认用户是否退出该页面。如何在Android中的片段onBackPress对话框?

在过去,我使用的活动,所以它没有问题。我只需要将对话框放在覆盖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() 
+1

什么是错误?如果你用'onBackPressed'替换'onDetach',它是否工作?编辑看看我发现[链接](http://stackoverflow.com/a/25574198/4385913)它有帮助吗? – 2015-02-11 08:14:15

+0

onBackPressed无法处理按菜单选项卡上的情况,并更改选项卡 – user782104 2015-02-11 08:20:14

+0

那么如果你尝试使用'setKeyListenerOnView'像[this](http://stackoverflow.com/a/27055873/4385913)? – 2015-02-11 08:21:35

回答

2

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

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

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

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

  1. 创建的接口,如BackNavigable(由那些想消费背压谁片段实现),用方法boolean consumeBackPress();
  2. 对于那些想消耗回来新闻发布会返回从实现真正的谁片段。
  3. 现在在活动onBackPressed()中查看当前片段,并检查该片段是否是BackNavigable的实例,并在其consumeBackPress()实现中返回true。如果是,则弹出该片段,否则请调用super.onBackPressed()的活动。

就是这样。

+0

非常感谢,当我按下菜单标签栏上的标签更改如何? – user782104 2015-02-11 09:13:39

+0

对于选项卡,只需使用子Fragment Manager而不是FragmentManager来实现相同的逻辑。 – 2015-02-11 13:28:23