当前场景
在我的应用程序中,我有带有碎片的导航抽屉。在肖像模式下,一切都很好。
问题
假设在纵向模式下,我从导航抽屉中选择第二项。它加载完美,但当我旋转我的手机到景观模式,第一个片段从导航菜单加载,而不是第二个。
我知道我必须为片段保存实例,但我不知道如何做到,应该在主要活动中还是在片段本身中这样做?
发布于 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?
另外,让我们提到onRestoreInstanceState,Fragment没有这个method.So,您应该使用onActivityCreated,它接收保存的实例状态(或null)的bundle。
看一下docs:
http://developer.android.com/reference/android/app/Fragment.html#onActivityCreated(android.os.Bundle)
发布于 2017-09-05 16:47:12
我在这个帖子中回答了同样的问题:
我试图解释为什么我给出的解决方案有效,所以如果你有兴趣,看看它。
为了解决这个问题,我只在if (导航抽屉活动的OnCreate中)中放置了膨胀初始片段的代码:
super.onCreate(savedInstanceState);
if(savedInstanceState==null){
FragmentManager fM = getSupportFragmentManager();
fM.beginTransaction().replace(R.id.NavDrawContent,new home_fragment()).commit();
}所以当我们改变方向时,它不会膨胀第一个片段,而在第二个
发布于 2018-08-15 01:57:04
我找到了一个更好的解决方案,使用了名为ViewModel类的新工具。当屏幕旋转时,它会自动破坏de活动并再次创建它,因此我们失去了最后选择的片段的焦点。ViewModel帮助我们保存数据,它对于表单也非常有用。
MainActivityViewModel.kt的类类MainActivityViewModel : ViewModel() { var menuItem : Int = R.id.nav_inicio }
我选择R.id.nav_inicio作为默认菜单项,根据activity_main_drawer.xml ( android的默认名称)对其进行修改。
lateinit var vm : MainActivityViewModel
vm = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)
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方法中。
override fun onNavigationItemSelected(item: MenuItem): Boolean { // Handle navigation view item clicks here. vm.menuItem = item.itemId // rest of the code ... }
现在,当您旋转屏幕时,值保存了这个位置,您可以在forms中使用它。
https://stackoverflow.com/questions/34978872
复制相似问题