我正在编写一个有两种"模式"的应用程序; 一种视图模式和一种编辑模式.该应用程序公开了两个主要/启动器活动(比如A和D),这些活动又有自己的活动链(分别为B,C和E,F).两个入口点活动A和D将在主屏幕中显示两个带有单独标签的图标,并且两个链从不交叉,即一旦您在具有活动A的查看模式下启动应用程序,您可以来回走动的唯一路线是A,B,C,如果您在具有活动D的编辑模式下启动应用程序,则唯一可用的活动链是D,E,F.
现在,我的问题是如果启动应用程序,例如查看模式(活动链A,B,C)并按下该链中任何活动的主页按钮,我会回到主屏幕(当然)但是如果我那么在编辑模式下重新启动应用程序(活动链D,E,F)我按下主页按钮(即错误链中的活动)时进入我正在进行的活动 - 而不是编辑模式的预期入口点; 活动d.
我该如何解决这个问题?
我曾尝试各种组合android:noHistory,android:clearTaskOnLaunch和其他属性在AndroidManifest.xml为参与活动.但它们似乎只影响了活动,而不是整个链条.
当我按下Home按钮时,我想从历史堆栈中删除整个活动链(A,B,C或D,E,F)但是当我还在链中时仍然保持堆栈完整(我想要能够从活动B按下后退按钮并进入活动A …
我完全赞同下面的导航

想象一下,Book详细信息是在BookDetailActivity的不同实例中创建的.
在book2详细信息中按下之前的堆栈是:
如果我遵循我将使用的指导方针:
Intent parentActivityIntent = new Intent(this, AllBooksActivity.class);
parentActivityIntent.addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();
Run Code Online (Sandbox Code Playgroud)
但是这个代码的一大问题是BookDetailActivity(Book 1)还活着!
在"向上"之后按下后退按钮将带来第1册的细节.
如何杀死BookDetailActivity原始AllBooksActivity和我按下的活动之间的所有内容?
我从活动A-> B-> C-> D-> E开始..当我从D-> E开始时,堆栈中应该没有活动但是,用户可以使用D中的后退按钮并转到C(没有刷新活动C,像正常的后退功能一样)
我正在使用viewpager在片段之间滑动,并希望后退按钮导航到先前查看的片段而不是结束活动.对不起,如果这是这个问题的副本,但我没有找到答案非常有帮助.显然onBackPressed需要被覆盖,但我不知道如何获取并显示正确的片段.我假设我应该使用fragmentmanager的backstack,但getSupportFragmentManager().getBackStackEntryCount()总是返回0.我是否需要使用手动将片段添加到backstack FragmentTransaction.addToBackStack()?如果是这样,我会在适配器中添加它?
这是我活动的代码,
public class PagerActivity extends FragmentActivity {
ArrayList<Sale> sales;
MyAdapter mAdapter;
ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent it = getIntent();
this.sales = (ArrayList<Sale>) it.getExtras().get("sales");
int position = it.getExtras().getInt("position");
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mPager.setCurrentItem(position);
}
public class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return sales.size();
}
@Override
public void destroyItem(ViewGroup …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的问题,当我用另一个片段替换它时,我的片段没有调用任何结束生命周期方法,如onPause和onStop.我像这样替换片段
public static void replaceFragment(Activity activity, int layoutId, Fragment fragment, String title, String shortTitle) {
FragmentTransaction transaction = activity.getFragmentManager().beginTransaction().replace(layoutId, fragment);
transaction.addToBackStack(title);
transaction.setBreadCrumbTitle(title);
transaction.setBreadCrumbShortTitle(shortTitle);
transaction.commit();
activity.getFragmentManager().executePendingTransactions();
}
Run Code Online (Sandbox Code Playgroud)
我认为它是以某种方式保持我的片段活着,即使我在popBackStack之后再次替换相同的片段之后它会被显示出来然后它也会在onStart之前调用onStop吗?
请帮我解决我的问题.
我有MainActivity一个framelayout.我想将一些片段替换为framelayout.现在我正在鼓励一个问题,它是:
1)我创建并将片段A放到framelayout.片段A叫onCreateView...等.
2)然后我创建并将片段B放到布局中......片段A被放在后台上并且它被调用onPause()(不叫onDeattach(),onDestroy......)
3)我按下了按钮.片段A是从后端堆栈获得的,但它onCreateView()再次调用.此操作使我的应用程序还有其他一些问题.
所以我的问题是如何在backstack中存储片段A并且它不会重新创建视图.
这是用于更改片段的方法:
public static void setContent(FragmentManager managerFragment, Fragment detailFragment) {
if (managerFragment != null) {
if(lastFragment==null && detailFragment instanceof HomeVer3Fragment ||
(lastFragment!=null && detailFragment instanceof HomeVer3Fragment && lastFragment instanceof HomeVer3Fragment)){
return;
}
String tag=detailFragment.getClass().getName();
managerFragment.popBackStackImmediate(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
FragmentTransaction ft = managerFragment.beginTransaction();
ft.replace(R.id.content_frame, detailFragment);
ft.addToBackStack(tag);
ft.commit();
lastFragment = detailFragment;
}
}
Run Code Online (Sandbox Code Playgroud)
感谢和抱歉我的坏问题,我的英语不太好.
我有一系列事件,通过它我逐一向后台添加了三个片段.这些片段中的每一个都涵盖了活动的全屏.
我已经存储了从Frag1的提交返回的.
现在在Frag3中,基于特定的点击,我想直接回到Frag1并丢弃/弹出其间的所有碎片.
因此,当单击此按钮时,我向活动发送消息,执行以下操作:
getSupportFragmentManager().popBackStack(mFrag1Id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
但我只是一个空白的屏幕,所以我假设没有加载任何片段.
我甚至尝试过:在提交 - fragmentTransaction.addToBackStack("Fragment1");
然后
getSupportFragmentManager().popBackStack("Fragment1", FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.有人可以帮我这个吗?
谢谢.
背景:
我有一个主要的Activity,它包裹了一个Fragment可以改变的主要部分,并且为了保持一个后备箱,我使用FragmentManager的是后备箱.
保持活动堆栈的主要区别在于,当一个片段被推到后台并被替换时,它会调用它onDestroyView()而不是它onDestroy(),当它返回时它的视图将被重新创建onCreateView().(onCreate()但未调用碎片对象未被调用)
在活动堆栈中,它不会发生,并且视图仍然存在.
这对低端设备有积极影响,因为Android操作系统可以释放一些内存而你不必保持正确的视图(在我的应用程序中,来自服务器的消息可能随时改变视图),这样可以节省宝贵的内存带宽也是如此.
实际问题:
假设我有一个片段,用户点击某些内容并更改了视图,例如扩展了列表.
如果用户然后转到另一个屏幕(即片段),则前一个片段将被推送到后台,并且它的视图将被销毁.
当用户返回时,片段将被重新创建,并且不会"记住"用户所做的更改,例如列表不会被扩展,因为它应该
那么如何在不为每个视图制作特殊情况的情况下保存状态并恢复它?
不受欢迎的答案:
onSaveInstanceState():当片段被推送到后台时,它不会被调用,因为活动没有被破坏而且不是配置改变.android savestate android-fragments back-stack fragmentmanager
从Android支持库升级23.1.1到最新后,我们的应用程序中25.1.0的行为popBackStack()发生了变化.
例如,我FragmentTransactions在BackStack上有三个.现在第四个FragmentTrsansaction被添加到BackStack.FragmentTransactions是这样的:
FragmentTransaction transaction = fragmentManager.beginTransaction()
.replace(R.id.fragment_container_single, target, CoreActivity.FRAGMENT_TAG_LEFT)
.addToBackStack(<CONCRETE_TRANSACTION_NAME>)
.commit();
Run Code Online (Sandbox Code Playgroud)
片段#4具有逻辑,它onViewCreated()自动路由到片段#5 (我知道,它很难看,我必须改变它).无论如何,当我想要离开片段#5时,我想恢复到片段#4之前显示的片段.我按事务名称执行此操作:
getFragmentManager().popBackStack(“<CONCRETE_TRANSACTION_NAME_4>”, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
或这个:
getFragmentManager().popBackStack(“<CONCRETE_TRANSACTION_NAME_3>”, 0);
Run Code Online (Sandbox Code Playgroud)
但与此调用onCreateView()和onViewCreated()碎片#4将被调用和片段#5将被立即添加到堆栈中.即使我恢复到片段#1 onViewCreated()为BackStack上的每个片段调用 - 对于片段#2,片段#3和片段#4,即使它们对我想要返回的FragmentTransaction无关紧要.
在支持库下,23.1.1我成功地跳回到片段#3.片段#4弹出包含而不调用onViewCreated().这似乎更直观,对我来说,因为onViewCreated()在FragmentTransaction"外部" 调用Fragments似乎没有必要吗?
我知道,addToBackStack()只保存事务状态而不是片段本身,并且可能必须重新创建片段.
有相似的帖子,但我想了解为什么它在支持库更新后中断.我无法在任何地方找到变化.这是一个Bug还是现在的Bug?
我正在改变我的代码.
感谢帮助!
更新 升级到support-library 25.1.0后,我有更多生命周期问题/更改.还有一个谷歌问题我另外评论了我的问题.目前我不得不回到最新的24.2.1并密切关注这个话题.这只是我的临时解决方案.这些问题始于support-library 25.0.0.
android android-fragments back-stack android-support-library
我正在尝试使用PendingIntent从通知中实现导航到我的应用程序的特定详细信息页面,但是我在从详细信息页面一直重新创建回溯到起始目的地时遇到了问题.
我在这里制作了一个示例应用程序,其中包含一个活动和三个片段来演示:
Fragment 1 -> Fragment 2 -> Fragment 3
(start dest) <- <-
Run Code Online (Sandbox Code Playgroud)
从片段1(起始目的地),我使用直接导航到片段3
Navigation.findNavController(this, R.id.nav_host_fragment).navigate(R.id.fragment2,
null,
NavOptions.Builder()
.build())
Run Code Online (Sandbox Code Playgroud)
从片段3开始,当我打电话时,我将Navigation.findNavController(this,R.id.nav_host_fragment).navigateUp()导航回Fragment 1.有没有办法让它导航到新创建的片段2?
android back-stack android-navigation android-jetpack android-architecture-navigation
android ×10
back-stack ×10
android-architecture-navigation ×1
fragment ×1
navigation ×1
savestate ×1