Android - 后退按钮和片段后台无法正常工作

时间:2012-09-26 20:42:18

标签: android android-fragments fragment-backstack

我正在开发一个带有片段FragmentActivity的基于片段的简单应用程序。应用程序的每个“屏幕”都包含在一个片段中,所有片段都会在应用程序启动时添加到容器布局中。

// Set up fragments in Main Activity
fragMan = getFragmentManager();
FragmentTransaction ft = fragMan.beginTransaction();
ft.add(R.id.fragment_container, settingsFragment);
ft.add(R.id.fragment_container, mapFragment);
ft.add(R.id.fragment_container, tracksFragment);
ft.add(R.id.fragment_container, waypointsFragment);
ft.commit();

通过隐藏当前可见的片段,然后显示适当的片段来完成转换。

ft = fragMan.beginTransaction();
ft.show(mapFragment);
ft.addToBackStack(null);
ft.commit();

这一切都运行正常,但是当按下后退按钮时,应用程序退出,无论哪个屏幕可见或先前的事务已添加到后栈。

我已经检查过以确保后端堆栈正确累积记录并尝试了许多不同的转换方法变体,例如替换片段而不是隐藏/显示它们,创建片段的新实例而不是将它们存储在变量中等等据我所知,我的代码与我能找到的所有教程和示例相匹配,我甚至都找不到任何类似问题/类似问题的例子,大概是因为标准实现对其他人来说“正常”

我怀疑它可能是应用程序级别的问题,例如我的清单中的属性(我已经非常彻底地调查过)或者我的应用程序设置方式固有的东西,这会阻止后退按钮正常运行。我可以覆盖onBackPressed来手动处理转换,但这似乎是一个非常难看的解决方法。关于为什么这可能没有按预期行事的任何想法?顺便说一下,这是运行Jelly Bean的Nexus 7。

3 个答案:

答案 0 :(得分:2)

检查您是否使用FragmentActivity(来自支持库)而不是Activity。这将导致后台堆叠和过渡问题。

答案 1 :(得分:0)

我不确定这是否能解决您的问题,但我认为您不需要添加所有片段。

我还注意到(至少在兼容性库中)替换方法似乎非常错误,所以最好首先删除现有的片段,然后添加新的片段。

以下是我用来更改片段的代码:

/**
 * Changes the detail fragment of this activity. This is how all content is presented in this app.
 * @param fragment
 * @param animated
 * @param addCurrentFragmentToBackStack
 */
private void changeDetailFragment(Fragment fragment,boolean animated,boolean addCurrentFragmentToBackStack)
{
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        if (animated)
            transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);

    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);


    String fragName = "NONE";

    if (currentFrag!=null)
        fragName = currentFrag.getClass().getSimpleName();


    if (currentFrag != null)
    {

        transaction.remove(currentFrag);
    }


    transaction.add(R.id.detailFragment,fragment);


    if (addCurrentFragmentToBackStack)
    {
        Log.i("APP_NAME","Adding: " + fragName + " to the backstack");
        transaction.addToBackStack(null);
    }
    else
    {
        Log.i("APP_NAME","Not adding: " + fragName + " to the backstack");
    }



    transaction.commit();

}

希望这有帮助。

答案 2 :(得分:0)

对我来说,将appcompat的版本更改为27.1.1(截至2018年8月15日)有效。原来是appcompat版本v7:28.0.0-rc01是罪魁祸首。