我正在开发一个燎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手工处理转变,但是这似乎是一个非常丑陋的解决方法。 任何想法,为什么这可能不会表现如预期? 顺便说一句,这是上运行果冻豆一台Nexus 7。
检查是否正在使用,而不是活动FragmentActivity(从支持库)。 这将导致堆栈中和转型问题。
我不知道这是否会解决你的问题,但我不认为你需要添加所有开始与片段。
我也注意到(至少与兼容性库)的替代方法似乎是非常错误,所以最好先删除现有的片段,然后添加新的。
下面是代码,我用它来改变一个片段位:
/**
* 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();
}
希望这可以帮助。
For me changing the version of appcompat to 27.1.1(As of 15/08/2018) worked. Turns out appcompat version v7:28.0.0-rc01 was the culprit.