博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fragment 横竖屏切换问题
阅读量:6540 次
发布时间:2019-06-24

本文共 1998 字,大约阅读时间需要 6 分钟。

转自:http://my.oschina.net/u/614511/blog/76444

在默认情况下当发生横竖屏切换时,当前Activity中的fragment都会通过Fragment.instantiate重新生成,该方法将使用默认的构造函数来生成相应的Fragment,所以如果没有默认构造函数的话将会报错,例如:

1
2
3
4
5
6
7
8
9
10
class
MyFragment {
public
MyFragment(
int
title, String message){
 
}
public
static
final
MyFragment newInstance(
int
title, String message)
{
    
MyFragment f =
new
MyFragment (
int
title, String message);
    
return
f;
}
}

这时候当横竖屏切换时由于MyFragment没有默认构造函数,将抛出java.lang.InstantiationException异常,正确的方式为使用Bundle来进行参数传递修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class
MyFragment {
private
static
final
String TITLE=
"title"
,MESSAGE=
"message"
;
private
String title,message;
public
void
onCreate(Bundle saveInstanceState){
    
title = getArguments().getString(TITLE);
    
message = getArguments().getString(MESSAGE);
}
public
static
final
MyFragment newInstance(
int
title, String message)
{
    
MyFragment f =
new
MyFragment (
int
title, String message);
    
Bundle bdl =
new
Bundle(
2
);
    
bdl.setString(TITLE,title);
    
bdl.setString(MESSAGE,message);
    
f.setArguments(bdl);
    
return
f;
}
}

 通过这种方式创建的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.

转载于:https://www.cnblogs.com/duanweishi/p/4523072.html

你可能感兴趣的文章
WCF 入门
查看>>
Django REST框架--关系和超链接api
查看>>
双击防止网页放大缩小HTML5
查看>>
C#的一些学习方法
查看>>
iOS开发-开发总结
查看>>
c++中的 Stl 算法(很乱别看)
查看>>
前端开发入门 --摘自慕克网大漠穷秋
查看>>
U3D Invoke() IsInvoking CancelInvoke方法的调用
查看>>
Javascript 如何生成Less和Js的Source map
查看>>
中间有文字的分割线效果
查看>>
<悟道一位IT高管20年的职场心经>笔记
查看>>
volatile和synchronized的区别
查看>>
10.30T2 二分+前缀和(后缀和)
查看>>
vuex视频教程
查看>>
Java 线程 — ThreadLocal
查看>>
安居客爬虫(selenium实现)
查看>>
-----二叉树的遍历-------
查看>>
ACM北大暑期课培训第一天
查看>>
Scanner类中输入int数据,再输入String数据不正常的
查看>>
F. Multicolored Markers(数学思维)
查看>>