- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我的抽屉导航中列出了许多页面/fragment ,用户可能会经常在这些页面/fragment 之间切换,我希望它们在后台堆栈中以便他们可以导航回来,但我只想要每个 fragment 的一个实例后台堆栈,这样用户就不必疯狂地按回很多次来退出应用程序。我不知道如何在不删除页面的情况下有效地“重新排序”backstack。
目前,当我更改页面时,我正在使用此代码来更改 fragment 并确保它仅在后堆栈中一次
if (mFragMgr == null) {
mFragMgr = getSupportFragmentManager();
}
String backStateName = fragmentDescriptor.name();
boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped){
mFragMgr.beginTransaction()
.remove((Fragment) mFragment)
.replace(R.id.content_frame, (Fragment) mFragment)
.addToBackStack(backStateName)
.commit();
}
我在 onBackPressed 中使用此代码
@Override
public void onBackPressed() {
if (mFragMgr.getBackStackEntryCount() > 0) {
mFragMgr.popBackStackImmediate();
} else {
super.onBackPressed();
}
}
这可行,但这意味着它会删除我不想删除的页面。示例:
当我的用户以 A > B > C > D > E > C
的顺序访问 6 个页面时,因为我正在执行删除操作,所以我希望得到以下堆栈:
[E] [C]
[D] [D] [E]
[C] [C] [C] [D]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
但我实际上得到的是以下内容 - 它会将所有内容弹出到与名称匹配的元素,这与我是否包含“.remove((Fragment) mFragment)”无关 - (I '现在已经意识到 remove 不会影响 backstack,所以无需指出这一点):
[E]
[D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
如果我在添加到后台堆栈时不使用名称而是使用 null,我会得到以下信息:
[C]
[E] [E]
[D] [D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
我怎样才能得到我期望的行为?是否有可能,还是我需要自己记录更改并完全跳过后台堆栈?
最佳答案
没有API可以做到这一点,但因为上周我也在想同样的事情,
我把它当作一个练习,我自己实现了它。
我的方法允许你从 backstack 中的任何地方删除一个 Fragment
,这是通过使用refrection 来修改将 backstack 信息存储在 FragmentManagerImpl 中的内部变量来实现的。和 BackStackRecord .
有几个重要的变量:
mBackStack
- 存储 BackStackRecord
,其中包含 Fragment
信息、先前的、动画等mActive
- 所有添加的Fragment
smAvailBackStackIndices
- 存储新插入的记录可以使用的索引,即 mActive
null
值的索引
使用 150 多个 Fragment
进行测试,没有发现任何泄漏,但仅在 DDMS
中监控堆,没有执行任何其他内存分析。
因此,由于某些内容可能被破坏,请探索代码,重新测试它,看看是否有人提供了更好的答案,然后重新考虑您是否真的需要在您的项目中这样做。
我将代码上传为 gist on GitHub ,希望对你有帮助。
关于Android Reorder Fragment Backstack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665346/
这是对 Reordering factor gives different results, depending on which packages are loaded 的跟进,还有另一个相关问题。
我最近一直在摆弄数组和数组排序,并偶然发现了一些奇怪的东西。 以这种情况为例: arr = {}; arr[1] = "one"; arr[2] = "two"; arr[105] = "three"
题目地址:https://leetcode.com/problems/reorder-list/description/ 题目描述: Given a singly linked list L: L
我使列表可重新排序,但现在又回到了初始状态。有人能帮我吗?我的列表包含列表磁贴,它是使用Asynsnapshot从数据库生成的。我使用的键与索引相同。似乎insert函数没有在新索引中插入注释。是因为
我很困惑为什么箱线图在此图中没有排序: set.seed(200) x <- data.frame(country=c(rep('UK', 10),
我有一个或多或少作为列表显示给用户的实体列表。现在,用户不仅可以添加或删除实体,还可以对现有实体重新排序(使用典型的“向上”、“向下”、“转到顶部”、“转到底部”操作)。 但是实现这种行为的最佳方式是
我正在尝试使用 Bootstrap 3 制作如下所示的网格。 目标 SM 医学博士 方法一 Content1
我有如下表格, | id | name | color | ------+--------+--------- | 1 | pear | green | | 2 | apple
似乎对 SQLite3 表中的列进行重新排序并不简单。至少 Firefox 中的 SQLite Manager 不支持此功能。例如,将 column2 移动到 column3,将 column5 移动
我的抽屉导航中列出了许多页面/fragment ,用户可能会经常在这些页面/fragment 之间切换,我希望它们在后台堆栈中以便他们可以导航回来,但我只想要每个 fragment 的一个实例后台堆栈
当我添加一段代码来测量 CPU 执行时间时,例如: int main() { clock_t init_time = clock(); // (1) your_fun(); // (2)
当用户更改顺序时,我需要同步两个 ListViews 事件的列顺序。但似乎没有列重新排序事件。 目前我只是做了一个 AllowsColumnReorder="False"但这不是一个永久的解决方案。在
我很难理解 reorder() 背后的逻辑。 假设 Var 定义如下: Var data(iris) > head(iris) Sepal.Length Sepal.Width Petal.Le
我正在创建一个 WPF 数据网格,我希望能够通过拖放重新排序行,如下所示:我单击一行并将其向上或向下拖动。正如我所做的那样,如果我释放鼠标,一个标记会显示行将被放置的位置。当我释放鼠标时,拖动的行被插
我想重新排序我的列表,但出现此错误。 此小部件的所有子项都必须在 Reorderable Listview 中有一个键 Widget list(list) { return Scrollbar
我想重新排序我的列表,但出现此错误。 此小部件的所有子项都必须在 Reorderable Listview 中有一个键 Widget list(list) { return Scrollbar
在我的数据库中我有如下三个表: 任务(TaskID、TaskName、TaskDescription) TaskDetails(TaskID、subTaskPosition、SubTaskID) 子任
我仍在使用 https://github.com/syntagmatic/parallel-coordinates#parallel-coordinates 绘制平行坐标图和 d3.js 轴重新排序后
我正在阅读Kyle Simpson's book (You don't Know JS - ES6 and beyond)他给出了有关重新排序数组的示例: var a1 = [ 1, 2, 3 ],
我的领域对象: public class MyDomainObject { public Guid Id { get; set; } public string Name { get;
我是一名优秀的程序员,十分优秀!