wil*_*ack 6 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();
Run Code Online (Sandbox Code Playgroud)
通过隐藏当前可见的片段,然后显示适当的片段来完成转换.
ft = fragMan.beginTransaction();
ft.show(mapFragment);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
这一切都运行正常,但是当按下后退按钮时,应用程序退出,无论哪个屏幕可见或先前的事务已添加到后栈.
我已经检查过以确保后端堆栈正确累积记录并尝试了许多不同的转换方法变体,例如替换片段而不是隐藏/显示它们,创建片段的新实例而不是将它们存储在变量中等等.正如我所知,我的代码与我能找到的所有教程和示例相匹配,我甚至无法找到任何类似问题/类似问题的例子,大概是因为标准实现"只适用于其他人".
我怀疑它可能是应用程序级别的问题,例如我的清单中的属性(我已经非常彻底地调查过)或者我的应用程序设置方式固有的东西,这会阻止后退按钮正常运行.我可以覆盖onBackPressed来手动处理转换,但这似乎是一个非常难看的解决方法.关于为什么这可能没有按预期行事的任何想法?顺便说一句,这是运行Jelly Bean的Nexus 7.
我不确定这是否能解决您的问题,但我认为您不需要首先添加所有片段。
我还注意到(至少对于兼容性库)替换方法似乎有很多错误,因此最好先删除现有片段,然后添加新片段。
这是我用来更改片段的代码:
/**
* 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();
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
5711 次 |
| 最近记录: |