Fragment 横竖屏切换问题
2014-01-27 17:41
489 查看
在默认情况下当发生横竖屏切换时,当前Activity中的fragment都会通过Fragment.instantiate重新生成,该方法将使用默认的构造函数来生成相应的Fragment,所以如果没有默认构造函数的话将会报错,例如:
这时候当横竖屏切换时由于MyFragment没有默认构造函数,将抛出java.lang.InstantiationException异常,正确的方式为使用Bundle来进行参数传递修改如下:
通过这种方式创建的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.
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 | } |
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.
相关文章推荐
- JS获取上一级目录
- Java反射机制
- PHP根据PNG图像生成新图并添加文字
- python Flask :TypeError: 'dict' object is not callable
- opengl编程指南笔记(六)第五章 光照
- MinGw+Msys搭建环境 编译ffmpeg
- ubuntu下配置jdk开发环境
- Java调用ffmepg+mencoder视频格式转换
- ACM - ICPC World Finals 2013 I Pirate Chest
- 关于Spring Data redis几种对象序列化的比较
- Magento中获取特定属性值
- 【js学习笔记-087】----文档和元素的几何形状和滚动(视口与窗口)
- LDD3源码分析之块设备驱动程序
- ThinkPHP配置项详细注解
- 如何增加网站的收录
- Xms Xmx PermSize MaxPermSize 区别
- UVA 755 - 487--3279
- JS把字符串按照特定的字母顺序进行排序
- QT VS2012下的配置方法
- JDBC元数据操作(一)-- DatabaseMetaData接口详解