Android 如何使用setRetainInstance(布尔值)?
假设我有一个Android 如何使用setRetainInstance(布尔值)?,android,android-fragments,android-viewpager,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,假设我有一个片段a。它有一个实例变量mviewpage,该变量指向它的ViewPager 在片段A的onCreate(Bundle)中,我调用setRetainInstance(true) 方向改变时: onCreateView(LayoutFlater、ViewGroup、Bundle)被调用,新视图被膨胀。因此,在新膨胀的视图中有一个新的ViewPager mviewpage在方向改变时指向原始的ViewPager 我的问题是:如何使(1)中新的ViewPager与(2)中保留的mviewp
片段a
。它有一个实例变量mviewpage
,该变量指向它的ViewPager
在片段A
的onCreate(Bundle)
中,我调用setRetainInstance(true)
方向改变时:
onCreateView(LayoutFlater、ViewGroup、Bundle)
被调用,新视图被膨胀。因此,在新膨胀的视图中有一个新的ViewPager
mviewpage
在方向改变时指向原始的ViewPager
ViewPager
与(2)中保留的mviewpage
相关联
或者我应该只使用
onSaveInstanceState(Bundle)
?正如@Selvin的注释中提到的,您应该让UI元素重新创建
您应该知道的一些信息:
setRetainInstance(true)
应仅用于非UI片段。我个人的建议是不要首先考虑这一点,除非你没有选择权。
要正确处理重新启动,您的活动
在正常的活动生命周期中恢复其以前的状态
哪一个Android在破坏您的应用程序之前调用onSaveInstanceState()
活动,以便保存有关应用程序状态的数据。你
然后可以在onCreate()或
onRestoreInstanceState()
使用onSaveInstanceState(Bundle)
是正确的,一般来说,您应该使用来保存您的状态。请注意,它是您保存的状态,而不是UI或整个片段
例如,状态可以是按钮被单击次数的计数。
查看下面关于如何保存状态的链接
此外,一些UI状态,例如EditText中输入的文本已经在系统API中处理。因此,您只需要处理自己维护的状态
编辑:
如果您是新手,不知道需要保存什么和不需要保存什么,只需先跳过它,然后在不使用
onSaveInstanceState
的情况下进行方向更改。然后,您很快就会发现在这个过程中丢失了什么,这将是您需要保持的状态。UI元素应该重新创建。。。您可以保留数据。。。所以第一个问题是:你不能。。。第二个问题:为什么?我问第二个问题是因为如果第一个问题的答案是你建议的,那么我想我需要另一种方法来恢复ViewPager
?你不需要ViewPager。。。保留后无效。。。您只需要从中获取数据。。。这就是为什么我要问你为什么需要viewPager实例(你想用这个实现什么),你的意思是我不需要旧的viewPager
,我只需要保留数据?对于数据,它是否意味着适配器?或者适配器后面的数据?或者适配器后面的数据?是的,最后我们讨论的是相同的。。。现在fx在onPostExecute
set字段List mDataFromWhichViewPagerWasBuild=somedata;buildAdapterForViewPagerAndSet(somedata)代码>。。。现在如果fragment retain,您可以在CreateViewif(mDataFromWhichViewPagerWasBuild!=null)buildAdapterForViewPagerAndSet(mDataFromWhichViewPagerWasBuild)上签入,否则新的AsynctTaskStartLoading().execute()代码>。。。如果方向更改为“setRetainInstance(true)应仅用于非UI片段”,则类似这样的内容不会加载数据fx,这非常有用。你救了我两次!