Fragment 横竖屏切换问题
2013-09-15 11:22
148 查看
在默认情况下当发生横竖屏切换时,当前Activity中的fragment都会通过Fragment.instantiate重新生成,该方法将使用默认的构造函数来生成相应的Fragment,所以如果没有默认构造函数的话将会报错,例如:
view source
print?
这时候当横竖屏切换时由于MyFragment没有默认构造函数,将抛出java.lang.InstantiationException异常,正确的方式为使用Bundle来进行参数传递修改如下:
view source
print?
通过这种方式创建的Fragment在横竖屏切换时通过getArguments依然能够获得之前设置的数据,其原理是在FragmentActivity切换时会调用onRetainNonConfigurationInstance方法将FragmentManager中管理的所有Fragment及其状态数据(其中就包括了这个设置的Bundle)保存在一个FragmentActivity.NonConfigurationInstances对象实例中,这样在新的FragmentActivity启动时在onCreate方法中可以使用Activity.getLastNonConfigurationInstance()方法来获取这个对象,然后通过FragmentManager.restoreAllState方法还原所有Fragment及其状态,需要注意的是在这种情况下可能会出现之前的Fragment没有detach而处于活动状态导致该Fragment的视图生成,可能会造成两个Fragment视图重叠的情况,在官方的Support.v4的例子中FragmentTabs.TabManager.addTab里有一段检查Fragment是否detach的代码正是用于解决这个问题。
通过上面的处理基本是没问题了,但因为默认情况下横竖屏切换后整个FragmentActivity会被销毁并重建,所有Fragment中的成员变量也会丢失,但所有的Fragment状态数据如上所述会被保留并还原,这个时候所有的视图都会重新创建。
解决方法一:在相应的Activity配置中加上android:configChanges="orientation|keyboardHidden"设置,这样切换时就不会销毁FragmentActivity,所有的Fragment的状态及视图也就会保持。
解决方法二:在使用FragmentTransaction.add()方法添加fragment时设置第三个tag参数,随后在还原时可通过FragmentManager.findFragmentByTag()方法找回还原的fragment.
view source
print?
01 | class MyFragment { |
02 | public MyFragment( int title, String message){ |
03 |
04 | } |
05 | public static final MyFragment newInstance( int title, String message) |
06 | { |
07 | MyFragment f = new MyFragment ( int title, String message); |
08 | return f; |
09 | } |
10 | } |
view source
print?
01 | class MyFragment { |
02 | private static final String TITLE= "title" ,MESSAGE= "message" ; |
03 | private String title,message; |
04 | public void onCreate(Bundle saveInstanceState){ |
05 | title = getArguments().getString(TITLE); |
06 | message = getArguments().getString(MESSAGE); |
07 | } |
08 | public static final MyFragment newInstance( int title, String message) |
09 | { |
10 | MyFragment f = new MyFragment ( int title, String message); |
11 | Bundle bdl = new Bundle( 2 ); |
12 | bdl.setString(TITLE,title); |
13 | bdl.setString(MESSAGE,message); |
14 | f.setArguments(bdl); |
15 | return f; |
16 | } |
17 | } |
通过上面的处理基本是没问题了,但因为默认情况下横竖屏切换后整个FragmentActivity会被销毁并重建,所有Fragment中的成员变量也会丢失,但所有的Fragment状态数据如上所述会被保留并还原,这个时候所有的视图都会重新创建。
解决方法一:在相应的Activity配置中加上android:configChanges="orientation|keyboardHidden"设置,这样切换时就不会销毁FragmentActivity,所有的Fragment的状态及视图也就会保持。
解决方法二:在使用FragmentTransaction.add()方法添加fragment时设置第三个tag参数,随后在还原时可通过FragmentManager.findFragmentByTag()方法找回还原的fragment.
相关文章推荐
- 笔记整理-困扰多时的多个Fragment横竖屏切换的问题
- viewpager + frgment 横竖屏切换 问题 Fragment被调用两次。
- Fragment 横竖屏切换问题
- Fragment 横竖屏切换问题
- Fragment 横竖屏切换问题
- 1Activity+多个Fragment模式下进行横竖屏切换的问题及解决方式
- Android中横竖屏切换加载不同布局导致fragment数据丢失的问题
- 关于横竖屏切换后Fragment发生重叠问题的解决
- Fragment 横竖屏切换问题
- Fragment 横竖屏切换问题
- webView中用到横竖屏切换,引起activity重构以及Fragment出现监听失效问题
- 在Android中自动实现横竖屏切换的问题
- Android解决Fragment中使用SurfaceView切换时闪一下黑屏的问题
- 频繁切换fragment报空的问题----fragment的切换-----再按一次退出程序
- Fragment 横竖屏切换时加载不同的布局
- 工厂模式加单例管理Fragment,同时解决fragment切换数据丢失问题
- 【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析
- 切换fragment回来的时候如果有类似viewpager的控件,会自动的被隐藏了,自动滑动了最上方的问题解决
- android fragment+ FragmentTabHost+viewpager 切换状态不保存的问题
- 解决Fragment中使用map,切换会闪一下黑屏的有关问题