Articles of back stack

使用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. 我已经看到了一些关于能够清除堆栈或删除顶部项目的信息,但我想在触发活动时从堆栈中删除多个项目。 感谢任何帮助,非常感谢。

在viewpager中使用backstack和back按钮

我正在使用viewpager在片段之间滑动,并希望后退按钮导航到先前查看的片段而不是结束活动。 很抱歉,如果这是这个问题的副本,但我没有find答案非常有帮助。 显然onBackPressed需要被覆盖,但我不知道如何获取并显示正确的片段。 我假设我应该使用fragmentmanager的backstack,但是getSupportFragmentManager().getBackStackEntryCount()总是返回0.我是否需要使用FragmentTransaction.addToBackStack()手动将片段添加到backstack? 如果是这样,我会在适配器中添加它? 这是我活动的代码, public class PagerActivity extends FragmentActivity { ArrayList sales; MyAdapter mAdapter; ViewPager mPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent it = getIntent(); this.sales = (ArrayList) 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 […]

在推出并从backstackpopup时保存并恢复Fragment的UI状态

背景: 我有一个主Activity ,它包装了一个可以更改的主Fragment ,为了保持一个后端,我使用了FragmentManager的backstack。 保持活动堆栈的主要区别在于,当一个片段被推送到后台并被替换时,它将调用它的onDestroyView()但不是它的onDestroy() ,当它返回时它的视图将使用onCreateView()重新创建onCreateView() 。 (但是没有调用onCreate()因为没有onCreate()片段对象) 在活动堆栈中,它不会发生,并且视图仍然存在。 这对低端设备有积极影响,因为Android操作系统可以释放一些内存而你不必保持正确的视图(在我的应用程序中,来自服务器的消息可能随时改变视图),这样可以节省宝贵的内存带宽也是如此。 实际问题: 假设我有一个片段,用户点击某些内容并更改了视图,例如扩展了列表。 如果用户然后转到另一个屏幕(即片段),则前一个片段将被推送到后台,并且它的视图将被销毁。 当用户返回时,片段将被重新创建,并且不会“记住”用户所做的更改,例如列表不会被扩展,因为它应该 那么如何在不为每个视图制作特殊情况的情况下保存状态并恢复它? 不受欢迎的答案: 保持视图活着:做一些事情来保持视图会破坏片段效率 使用onSaveInstanceState() :当片段被推送到backstack时,它不会被调用,因为活动没有被破坏,而且这不是配置更改。 特殊对象:如果系统可以为您完成,则不想这样做。

在Android中重新创建Backstack

我刚刚实现了一种在我的应用中更改主题的方法。 按下按钮可在SharedPreferences中设置一个值,然后重新创建活动,并且由于该标志而更改主题。 问题是如何处理后台堆栈。 简单地重新创建活动并不好,因为按下硬件后退按钮将恢复先前的活动(旧主题仍然设置),而如果用户执行以下操作: 从活动A> B> C>按主题更改按钮>按硬件后退按钮开始 然后我想让它们被正确应用新主题带回活动B. 到目前为止,我发现的最佳解决方案是根据对象层次重新创建后台堆栈,如下所示: Intent intent = new Intent(); intent.setClass(activity, activity.getClass()); TaskStackBuilder stackBuilder = TaskStackBuilder.create(activity); stackBuilder.addNextIntentWithParentStack(intent); stackBuilder.startActivities(new Bundle()); 但是我们的应用程序中的Activity层次结构没有很好地定义(即C可以有多个父项),因此上面的代码可能导致用户在按下后退按钮后被带回到意外活动。 有没有一种干净的方法来重建基于实际的后栈而不是Activity层次结构的后栈?