首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随导航抽屉旋转时片段的更改

随导航抽屉旋转时片段的更改
EN

Stack Overflow用户
提问于 2016-01-24 17:15:32
回答 5查看 8.6K关注 0票数 3

当前场景

在我的应用程序中,我有带有碎片的导航抽屉。在肖像模式下,一切都很好。

问题

假设在纵向模式下,我从导航抽屉中选择第二项。它加载完美,但当我旋转我的手机到景观模式,第一个片段从导航菜单加载,而不是第二个。

我知道我必须为片段保存实例,但我不知道如何做到,应该在主要活动中还是在片段本身中这样做?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-24 17:26:20

你应该在你的Fragment中这样做。

只需遵循以下链接:

Android - save/restore fragment state

或者也许:

Once for all, how to correctly save instance state of Fragments in back stack?

另外,让我们提到onRestoreInstanceStateFragment没有这个method.So,您应该使用onActivityCreated,它接收保存的实例状态(或null)的bundle

看一下docs:

http://developer.android.com/reference/android/app/Fragment.html#onActivityCreated(android.os.Bundle)

票数 3
EN

Stack Overflow用户

发布于 2017-09-05 16:47:12

我在这个帖子中回答了同样的问题:

How to keep the same fragment when activity restarts due to orientation change in a Navigation Drawer Activity

我试图解释为什么我给出的解决方案有效,所以如果你有兴趣,看看它。

为了解决这个问题,我只在if (导航抽屉活动的OnCreate中)中放置了膨胀初始片段的代码:

代码语言:javascript
复制
super.onCreate(savedInstanceState);
if(savedInstanceState==null){
    FragmentManager fM = getSupportFragmentManager();
    fM.beginTransaction().replace(R.id.NavDrawContent,new home_fragment()).commit();
}

所以当我们改变方向时,它不会膨胀第一个片段,而在第二个

票数 3
EN

Stack Overflow用户

发布于 2018-08-15 01:57:04

我找到了一个更好的解决方案,使用了名为ViewModel类的新工具。当屏幕旋转时,它会自动破坏de活动并再次创建它,因此我们失去了最后选择的片段的焦点。ViewModel帮助我们保存数据,它对于表单也非常有用。

  1. 创建一个名为MainActivityViewModel.kt的类
  2. 将此代码放入:

类MainActivityViewModel : ViewModel() { var menuItem : Int = R.id.nav_inicio }

我选择R.id.nav_inicio作为默认菜单项,根据activity_main_drawer.xml ( android的默认名称)对其进行修改。

  1. 然后,使用导航抽屉将其声明到MainActivity中:

lateinit var vm : MainActivityViewModel

  1. 将这一行添加到onCreate重写方法中:

vm = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)

  1. 然后创建一个加载默认片段的函数:

fun loadDefaultFragment() { when (vm.menuItem) { R.id.nav_inicio -> { fab.hide() val fragment = InicioFragment() val manager = supportFragmentManager manager.beginTransaction().replace(R.id.content_main, fragment, fragment.getTag()).commit() } R.id.nav_puntosventa -> { fab.show() val fragment = ListaPuntosFragment() val manager = supportFragmentManager manager.beginTransaction().replace(R.id.content_main, fragment, fragment.getTag()).commit() } else -> { // default fragment if you consider necessary } } }

该函数必须在初始化onCreate后调用到ViewModel方法中。

  1. 最后,每次选择新菜单项时,我们都必须更新viewModel值,因此修改覆盖函数onNavigationItemSelected,在开头添加它:

override fun onNavigationItemSelected(item: MenuItem): Boolean { // Handle navigation view item clicks here. vm.menuItem = item.itemId // rest of the code ... }

现在,当您旋转屏幕时,值保存了这个位置,您可以在forms中使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34978872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档