按后退按钮返回片段

时间:2013-11-18 16:39:59

标签: android android-fragments android-asynctask

我想通过按后退按钮返回另一个片段。我已经读过,addToBackStack (String tag)应该会有所帮助,但它确实没有用。

这是切换片段时我正在做的事情。

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.content_frame, new MainFragment());
ft.addToBackStack("Mainfragment");
ft.commit();

现在,片段打开,并启动AsyncTask,其中会出现加载圈。加载后,显示数据。当我现在按下后退按钮一次时,片段将返回创建加载圆的AsyncTask的开头。但AsyncTask不会继续。当我再次按下后退按钮时,应用程序将关闭。

我试图添加onBackPressed,但它只是告诉我,这在片段中不起作用。什么是最好的方式去这里?

编辑以澄清: 没有错误。它只是不起作用。就像我甚至没有行addToBackStack -

1 个答案:

答案 0 :(得分:3)

之前我遇到过同样的情况,我最终得到了这个解决方案。添加或替换Fragments时,需要使用唯一名称将其添加到backStack。然后当按下后退按钮时,您可以在创建片段的FragmentActivity中使用下面的方法查看哪个片段是活动片段。

private String getCurrentFragmentName() {

    int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();

    String fragmentName;

    if (backStackEntryCount > 0) {
        fragmentName = getSupportFragmentManager().getBackStackEntryAt(backStackEntryCount - 1).getName();
    } else {
        fragmentName = "";
    }

    return fragmentName;
}

并在onKeyDown()方法中执行以下操作。

    if (keyCode == KeyEvent.KEYCODE_BACK && getCurrentFragmentName().equals("your fragment name")) {
        // Handle back press for this case.
        return true;

    } else if (keyCode == KeyEvent.KEYCODE_BACK
            && getCurrentFragmentName().equals("your another fragment")) {

        // Handle back press for another Fragment
        return true;

    } else {
        return super.onKeyDown(keyCode, event);
    }

这就是我如何使用backStack添加Fragment

transaction.addToBackStack("Your Fragment Name");