- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
具有添加 fragment 和稍后的 replace()
fragment 的流程。所有 fragment 都是动态添加的,但不是所有 fragment 都调用addToBackStack()
。
getSupportFragmentManager().beginTransaction()
.add(R.id.frgment_holder, frgmtA, frgmtA.NAME)
.commit();
在某个地方它可以添加另一个,比如:
getSupportFragmentManager().beginTransaction()
.replace(R.id.frgment_holder, frgmtB)
.addToBackStack(frgmtB.NAME)
.commit();
带有 frgmtB 的 replace()
将从容器 R.id.frgment_holder 中删除 frgmtA。如果在此状态下按下后退按钮,它将弹出 frgmtB。但是,即使添加时没有调用 addToBackStack()
,它会重新创建 frgmtA 吗?
如果在将 fragment 添加到同一容器中的流程中,连续调用混合了 add() 和 replace() 调用,并且有人调用了 addToBackStack()
但有人没有调用,后退按钮的行为会如何?
编辑:在
之后getSupportFragmentManager().beginTransaction()
.replace(R.id.frgment_holder, frgmtB)
.addToBackStack(frgmtB.NAME)
.commit();
会不会
getSupportFragmentManager().findFragmentByTag(frgmtA.NAME);
还在找frgmtA吗?如果添加 frgmtA 时也调用了 addToBackStack() 怎么办;
文档说“这首先搜索当前添加到管理器 Activity 的 fragment ;如果没有找到这样的 fragment ,则搜索当前返回堆栈中的所有 fragment 。”
情况是
(如果 frgmtA 不是由 add() 动态添加的,而是在布局文件中用 class="frgmtA"指定的怎么办?)
用 frgmtB 替换(); addToStack();
用 frgmtC 替换(); addToStack();
然后,如果 stackTop 是 frgmtC,则希望按下后退按钮以带回第一个 frgmtA 及其最后的 UI 状态。
最佳答案
1.
.add(R.id.frgment_holder, frgmtA, frgmtA.NAME)
.commit();
.replace(R.id.frgment_holder, frgmtB, frgmtB.NAME)
.addToBackStack(frgmtB.NAME)
.commit();`
替换将从 holder 中删除 frgmtA,并且它的 onDestroyView 将被调用(但由于它在后台事务数据中被引用,frgmtA 不会被销毁)。并且 frgmtB 将被添加到 holder 中。由于 frgmtA 没有被破坏,
getSupportFragmentManager().findFragmentByTag(frgmtA.NAME);
会找到的。
然后,按下后退按钮,它会从 backStack 中弹出顶部交易,然后撤消交易。即从支架中取出 frgmtB 并将 frgmtA 添加回支架。由于不再有对 frgmtB 的引用,它的 onDestroy 被调用。
2。在
的情况下add frgmtA;
replace() with frgmtB; addToStack();
replace() with frgmtC; addToStack();
如果想后退跳转到frgmtA,需要重写onBackPressed(),在里面做
popBackStack(frgmtB.NAME, POP_BACK_STACK_INCLUSIVE),
这将在名为 frgmtB.NAME 的堆栈条目上方的堆栈中抛出交易,并在其上反转交易,这将添加回 holder 中的 frgmtA。
关于android - FragmentTransaction::replace() 有或没有 addToBackStack(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33508480/
当我使用 fragment “replace”时,新的共享元素转换可以工作,但我似乎无法让它工作 fragment “add”。在这两种情况下,我都使用相同的容器。 更多详情: Activity -布
我已经知道的是: 在fragmentTransaction.replace()之后,会调用当前fragment的onStop()函数而 fragmentTransaction.add() 不会。 在调
我正在使用 fragment ,在我的应用程序中显示两个屏幕。每个 Fragment 都有自己的一组操作栏按钮菜单布局。 在使用 FragmentTransaction replace() 方法提交
当我回顾一个项目的旧代码时,我意识到整个项目都在使用 FragmentTransaction.replace 而不是 FragmentTransaction.add。 public class Upg
我一直在我的一个项目中使用 FragmentTransaction 来设置初始 fragment //Set the fragment initially MainFragment fragment
我的 add() 方法遇到问题,该方法无法读取参数它无法将我的 BlankFragment 类作为 fragment 读取,而是读取包名称,后跟类名称(即我的代码) package com.examp
我不会替换我的 fragment ,但我有一个问题,当我在 beginTransaction() 之后调用 replace 时,Android Studio 不会给出错误。 FragmentManag
我想创建一个类,它的功能只是做一个 fragmentTransaction,但我有一个错误。下一个是我的课: package net.elinformaticoenganchado.sergio.cr
在我的应用中,我有一个 ListFragment: Fragment fragment = new MyFragment(); FragmentManager fragmentManager = g
我的 Android 代码有一个非常奇怪的行为。 真正的问题在代码之后。 我想要做的是拥有一个应用程序,该应用程序只能在手机上以纵向模式运行,而在平板电脑上可以同时以纵向和横向模式运行。为此,我在不同
我在替换 FrameLayout 容器内的 fragment 时遇到了错误。当应用程序第一次启动时一切正常,但是当我隐藏应用程序然后恢复它时,当调用 FragmentTransaction.repla
我有加载器 fragment ,并且正在从加载器 fragment 调用另一个 fragment 。一切正常,但突然我的 fragment 加载器给我一个错误。在加载器 fragment 中,我显示进
我已经在 stackoverflow 上搜索过这个问题并找到了这两个解决方案: Replacing a fragment with another fragment inside activity g
我正在学习 fragment ,下面给出的是我的第一个 fragment 程序。一个简单的项目,我有 2 个屏幕。当我单击第一个屏幕的下一步按钮时,需要显示第二个按钮。 我的目标是 Android 2
为什么我的 fragment 不能添加到后台堆栈? @Override public void onTabSelected(Tab tab, android.app.FragmentTrans
我在 FragmentStatePagedAdapter 中使用 Tabs。下面的代码来自 onOptionsItemSelected(MenuItem item) 方法: case R.id.men
我在一个 Activity 中有三个 fragment ,并在 Activity 中处理了反压。在一个 fragment 中 back press (CallingFragment) 它加载 Dial
我在一个选项卡中将一堆 FragmentTransactions 添加到后堆栈中,并且当用户选择不同的选项卡时,我想将它们全部从后堆栈中清除。我找不到从后台堆栈中清除东西的方法,只有将它们弹出的方法,
我正在构建一个平板电脑应用。在这个应用程序中,有一个带有两个 fragment 的 Activity 。第一个 fragment 是“已知”列表 fragment ,它显示来自数据库查询的简单单项布局
我的错误: java.lang.IllegalStateException: 已调用提交 我的代码: final FragmentTransaction fragmentTransaction =ge
我是一名优秀的程序员,十分优秀!