- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个带有双 Pane 的 Activity :左侧是菜单项列表( fragment M),右侧是当前所选项目的详细信息( fragment D)。
当用户选择 fragment D 中的项目时, fragment D 会被另一个 fragment 替换(我们称之为 D1)。当用户选择 fragment D1 中的项目时, fragment D1 会被另一个 fragment (我们称之为 D2)替换,依此类推。当然,当用户按下后退按钮时,她可以在 fragment 历史中返回:D2->D1->D。
我的问题是:如何在配置更改时(特别是在屏幕方向上)保存和恢复完整的 fragment 返回堆栈?
我觉得很奇怪以前没有其他人遇到过这个问题,但是我在 Google 和 Stack Overflow 上搜索时没有找到任何相关信息。如果我错过了任何相关的帖子,请告诉我。
我知道我可以简单地将 android:configChanges="orientation|screenSize"
属性添加到我的 Activity 中以避免 Activity 重新生成,但我就是不能那样做。
我不能这样做的原因是我正在使用 Action Bar Sherlock(第 4 版)来实现向后兼容性,并且该组件需要 Activity 重新创建才能在配置更改时正确运行,AFAIK。
如果有另一种方法可以在不破坏和重新创建 Activity 的情况下重新创建 Action Bar Sherlock 组件,请告诉我。
提前致谢。
最佳答案
我能够通过在将 fragment 添加到我自己的 ArrayList 中时缓存 fragment 来做到这一点。然后我设置了一个 OnBackStackChangedListener 来跟踪显示了哪个,并在必要时弹出 ArrayList。
我的目的有点不同,但下面的代码应该是您所描述的内容所需要的。标签是这样的,如果需要,您可以拥有多个后退堆栈。它不会按原样编译(我已经剪辑了很多我自己的代码)但应该让您了解我是如何做到的。附加免责声明:我刚刚让这个工作正常,可能还有一些我还没有遇到的问题。
public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag)
{
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(visibleFragment);
ft.add(R.id.realtabcontent, fragment, tag);
ft.attach(fragment);
ft.addToBackStack(null);
manualBackStacks.get(tag).add(fragment);
ft.commit();
this.getSupportFragmentManager().executePendingTransactions();
}
您需要在方向更改后重新创建 Activity 的代码:
ArrayList<Fragment> backStack =
new ArrayList<Fragment>(manualBackStacks.get(tag));
popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote
for (int bs = 1; bs < backStack.size(); bs++) {
replaceFragmentWithBackStackForTag(backStack.get(bs), tag);
}
后台监听器:
public void onBackStackChanged() {
int index = getSupportFragmentManager().getBackStackEntryCount();
ArrayList<Fragment> backStack = manualBackStacks.get(tag);
visibleFragment = backStack.get(index);
// Pop the last element if we've backed up.
popArrayListToIndex(backStack, index);
}
希望这对您有所帮助。
关于Android onConfigurationChanged : how to save and restore fragment back stack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999426/
我的应用程序最初是显示商店标签,从服务中加载获取所有商店名称并适合自动完成后,然后向用户显示自动完成 block ,用户可以选择商店。一旦他选择了用户可见的商店登录 block 。 我的问题是用户选择
我试图通过将 android:configChanges="orientation|screenSize" 设置为我的 Activity 来停止由于设备方向更改而引起的 Activity 娱乐并通过覆
为什么当我在模拟器中切换方向 (ctrl+F11) 时,没有调用 onConfigurationChanged 覆盖方法。 public class HelloSample extends Activ
我正在使用以下代码在用户旋转设备时更改我的 Activity 方向。这第一次工作正常,但没有再次调用。请指正。 @Override public void onConfigurationCha
我有一个图像查看器应用程序,可以处理具有大量缓存的非常大的图像。当用户旋转设备时,如果应用程序完全重新启动,则会导致打嗝。 如果我禁用方向更改,则设备旋转是无缝的,但我有一个横向和纵向方向不同的侧边栏
我已经搜索了很长时间,但仍然没有运气。将代码更改为现在编辑的版本。已编辑在 onCreate 中以此开始应用程序: @Override protected void onCreate(Bund
如何在保持纵向模式布局的同时检测横向模式? 无论实际移动方向如何,我都有一个保持纵向模式的 Activity 。我可以通过将 android:screenOrientation="portrait"
这种行为在 Android GingerBread 中很受欢迎。我重写了 onConfigurationChanged() 以更新布局以更改设备的方向。(更新了 list 文件中的 android:c
我正在编写一个代码,当方向改变时改变 TextView 的文本我正在使用 onConfigurationChanged() 监听器来更改文本 override fun onConfigurationC
我试图重写方法 onConfigurationChanged 并且我收到错误: BaseActivity 类型的 onConfigurationChanged(Configuration) 方法必须覆
我在 try catch onConfigurationChanged 事件时遇到问题。这是场景: Activity A 开始(监听onConfigurationChanged) 手机旋转到横向模式(
我有一个处理配置更改的 Activity 。但现在我必须改变布局。我尝试在 onConfigurationChanged 回调中再次设置布局并希望获得正确的布局(土地)但它仍在显示纵向 View 的第
我的应用程序出现了奇怪的问题。我问 here 的主要问题。问题是 android:configChanges="keyboardHidden|orientation" 在我的代码中不起作用。 所以我找
我是一名年轻的 Android 开发者,我找不到解决我的问题的方法。 我想在配置更改后立即模拟一个事件,为此我尝试使用 onConfigurationChanged() 但使用此方法时,我的事件会在屏
有没有一种方法可以在不破坏整个 Activity 的情况下,将 ImageView 可绘制对象更改为横向模式的相应可绘制对象。我试图在 onConfigurationChanged 回调中再次设置可绘
屏幕旋转后,其中一个 View 对象的高度发生变化,我想知道以像素为单位的高度值。 onConfigurationChanged 方法可能在 View 完成旋转之前被调用。所以如果我在这个方法中测量
我必须在一个 fragment 的语言更改时刷新 fragment 内容。所以我想到了在我的主要 Activity 中使用 onConfigurationChange 方法(这个 Activity 控
所以我要做的就是检查方向并根据它更改图像。问题是图像没有变化,toast 消息也没有起作用。不知道为什么..我在其他地方也有同样的代码。 Java: public class Test extends
不再调用我的应用 onConfigurationChanged。我已将我的 SDK API 更新为 Lollipop,并将 SDK 级别 im AndroidManifest 设置如下: 我不知道我
我在 SO 上看到了一些相关问题,但我无法解决我的问题。我为纵向和横向模式创建了单独的布局。 我已经针对相应的方向更改修改了 AndroidManifest.xml 文件,但是当我在 Activity
我是一名优秀的程序员,十分优秀!