Articles of back stack

在Backstack中不是最顶层的片段将恢复

鉴于应用程序流程在图形和文本中描述如下所示。 片段1是最低片段,但不是通过设置disallowAddToBackStack在backstack中。 使用fragmentTransaction.addToBackStack()将片段2推入堆栈。 片段1的新实例被推入堆栈。 最顶层的片段(片段1)从堆栈中popup。 活动2成为前景。 活动1成为前景。 这是我用来处理片段的通用方法: private void changeContainerViewTo(int containerViewId, Fragment fragment, Activity activity, String backStackTag) { if (fragmentIsAlreadyPresent(containerViewId, fragment, activity)) { return; } final FragmentTransaction fragmentTransaction = activity.getFragmentManager().beginTransaction(); fragmentTransaction.replace(containerViewId, fragment); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); if (backStackTag == null) { fragmentTransaction.disallowAddToBackStack(); } else { fragmentTransaction.addToBackStack(backStackTag); } fragmentTransaction.commit(); } 问题 当活动1在最后一步中恢复时,片段1的最低实例也将恢复。 此时,片段1在getActivity()上返回null 。 题 为什么堆栈中不是最重要的片段会重新开始? 如果恢复片段是正确的 – […]

尝试避免向backStack添加两次相同的片段,popBackStackImmediate总是返回false

我正在尝试使用此方法避免向backStack添加相同的片段: public static void replaceFragment(FragmentManager fragmentManager, Fragment fragment, Boolean addToBackStack) { String backStateName = fragment.getClass().getName(); boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); if (addToBackStack && !fragmentPopped && fragmentManager.findFragmentByTag(backStateName) == null) { fragmentManager .beginTransaction() // .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.fade_in, android.R.anim.fade_out) .replace(R.id.container, fragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .addToBackStack(backStateName) // was ‘backStateName’ .commit(); } else { if (!addToBackStack) fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); fragmentManager .beginTransaction() // .setCustomAnimations(android.R.anim.slide_in_left, […]

使用导航模式隐藏actionBar选项卡会对片段后台堆栈产生负面影响

我有一个带有操作栏和操作栏标签的活动。 当我从选项卡的内容中选择一个项目时,我正在尝试用新的替换当前片段,将事务添加到后端堆栈,并隐藏选项卡。 我通过将操作栏导航模式更改为标准来隐藏选项卡。 问题是,当我按下后退按钮时,我只是使用操作栏获得一个空白视图(在标准模式下)..片段事务似乎没有被反转。 如果我不通过将导航模式更改为标准来隐藏选项卡,则事务撤销工作正常。 我已经尝试重写后退按钮将导航模式更改回选项卡,但它不起作用。 有人能告诉我他们将如何实现这一目标吗? 以下是隐藏选项卡并执行片段事务的代码: ActionBar actionBar = getActivity().getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); Fragment albumListFragment = new AlbumListFragment(); albumListFragment.setArguments(bundle); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(android.R.id.content, albumListFragment); ft.addToBackStack(null); // Commit the transaction ft.commit(); 为清楚起见:我希望在提交此事务后回退,选项卡将返回到前一个片段的视图。 在按下之后,它没有显示标签或片段。

使用Backstack时TabLayout ViewPager不加载

我在我的一个片段中使用TabLayout,并使用viewPager在标签下方的两个片段之间切换。 当我单击其中一个较低片段中的FAB时,我会加载一个新片段(用于输入)。 但是 – 当我按下BACK按钮时,TabLayout会显示但没有任何一个较低的片段(由页面表示)。 那么我做错了什么? 是否有更好的方式来交换片段 ? 有没有办法按后退按钮并返回到正在显示的viewPager页面? 使用TabLayout的片段:CustomTemplatesFragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_custom_templates, container, false); final TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout); tabLayout.addTab(tabLayout.newTab().setText(R.string.macro_tab)); tabLayout.addTab(tabLayout.newTab().setText(R.string.lifestyle_tab)); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final ViewPager viewPager = (ViewPager) view.findViewById(R.id.pager); final CustomTemplatesPagerAdapter adapter = new CustomTemplatesPagerAdapter (getFragmentManager(), […]

防止同一碎片堆叠多次(addToBackStack)

我有一个带有三个片段的Activity ,我们称它们为A , B和C. Fragment A在Activity onCreate()调用。 FragmentA fragA = new FragmentA(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.activity2_layout, fragA, “A”); transaction.commit(); 当按下某些按钮时,会被Fragment B或C替换,FragmentTransaction会调用addToBackStack() 。 FragmentB fragB = new FragmentB(); //or C FragmentTransaction transaction = manager.beginTransaction(); transaction.replace(R.id.activity2_layout, fragB, “B”); //or C transaction.addToBackStack(“B”); //or C transaction.commit(); 但是我可以说我连续三次调用Fragment B ,我怎样才能阻止它自己堆叠? 同时我希望这是可能的: B调用> C调用> B调用 – 但是当我尝试返回时我希望B只打开一次( C < B […]

如何像Splash屏幕一样只运行一次活动

在我的应用程序中,我想在第一次运行时运行一次启animation面,但问题是我已经放入Manifest这行: android:noHistory=”true”如果我按下后退按钮并退出应用程序,效果很好但请注意,该应用程序仍然在后台运行,当我按下应用程序图标时,它会再次返回到启animation面,然后是我的注册页面。 当我重新打开我的应用程序时,我想直接重定向到注册页面。 我该怎么做呢? 提前感谢任何建议。

共享时“FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET”的目的是什么?

我已经阅读了http://developer.android.com/guide/components/tasks-and-back-stack.html ,我已经查找了FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET的文档,但我仍然不明白为什么谷歌的员工决定将它包含在关于共享的博客文章中。 http://android-developers.blogspot.com/2012/02/share-with-intents.html 这是他们的代码片段: Intent intent=new Intent(android.content.Intent.ACTION_SEND); intent.setType(“text/plain”); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); // Add data to the intent, the receiving app will decide what to do with it. intent.putExtra(Intent.EXTRA_SUBJECT, “Some Subject Line”); intent.putExtra(Intent.EXTRA_TEXT, “Body of the message, woot!”); 文件说: If set, this marks a point in the task’s activity stack that should be cleared when the task is […]

自定义TaskStack从通知中完成父活动

我在使用TaskStack进行通知时遇到问题。 我正在尝试在点击通知时保持我的应用程序的导航流程。 我的应用程序的导航样式如下: PrincipalActivity (父)→ SecondaryActivity (子) 有时,GCM服务可以推送启动SecondaryActivity通知。 PrincipalActivity的实例可能存在或不存在,因此我从TaskStack实现了一个自定义PendingIntent(见下文)。 这在PrincipalActivity暂停或关闭时有效。 当用户在前台的PrincipalActivity中点击通知时出现问题: PendingIntent调用PrincipalActivity.onDestroy()并创建丢失所有数据的新堆栈活动。 服务推送通知: Intent notificationIntent = new Intent(context, SecondaryActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(SecondaryActivity.class); stackBuilder.addNextIntent(notificationIntent); PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mNotifyBuilder.setContentIntent(pendingIntent); mNotificationManager.notify(id, mNotifyBuilder.build()); AndroidManifest.xml中 我尝试使用PendingIntent ( FLAG_UPDATE_CURRENT , FLAG_ONE_SHOT )的标志,并尝试使用不同的launch_mode进行清单中的活动( singleTask , singleTop , singleInstance ),但没有运气。 当父级已经在前台并且不丢失数据时,如何使用activity和parent创建上述自定义TaskStack ? (理想情况下,重用堆栈中的活动?)

Android:BackStack行为不端,如果应用程序是从另一个应用程序启动的

我有一个应用程序,它以SplashScreenActivity开头。 之后,将显示LoginActivity ,或者如果用户已登录,则会显示MainActivity 。 如果应用程序已在运行,则SplashScreenActivity被解除以下内容 //SplashScreenActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Adding this check for following cases if (!isTaskRoot()) { String intentAction = getIntent().getAction(); if (getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) { finish(); return; } if(getIntent().getCategories().contains(GCMIntentService.INTENT_CATEGORY_GH_NOTIFICATION)){ finish(); return; } } 出现问题 如果我从另一个活动(如PlayStore)启动应用程序,它会在正确的活动中恢复,如果已经运行的话。 这是我用来在第二个应用程序中重现的Intent //AnotherApplication.apk Intent launchIntent = getPackageManager().getLaunchIntentForPackage(“my.package.name”); startActivity(launchIntent); 但是,这个动作以某种方式打破了Backstack。 它不是在MainActivity中关闭背压应用程序,而是重新启动应用程序。 //MainActivity.class […]

在Android中修改后台堆栈

我想在我的Android应用程序中修改后台堆栈: 现在,这是流程: A – > B – > C – > D – > E – > F. 我希望能够修改后台堆栈,这样当用户进入活动F时,D和E将从堆栈中删除。 因此,如果用户击中背部,则流量为F – > C. 此外,从F,用户能够进入活动B,这也应该擦除C,D,E和F. 我已经看到了一些关于能够清除堆栈或删除顶部项目的信息,但我想在触发活动时从堆栈中删除多个项目。 感谢任何帮助,非常感谢。