在默认情况下当发生横竖屏切换时,当前Activity中的fragment都会通过Fragment.instantiate重新生成,该方法将使用默认的构造函数来生成相应的Fragment,所以如果没有默认构造函数的话将会报错,例如:
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来进行参数传递修改如下:
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.
分享到:
相关推荐
本项目"fragment横竖屏切换demo"是一个实际操作的例子,展示了如何利用Fragment来实现横竖屏切换,从而适应不同设备的屏幕方向变化。 在Android系统中,当设备屏幕方向发生变化时,系统默认会重新创建Activity以及...
Fragment的设计使得应用在不同设备和屏幕尺寸上表现得更加灵活,尤其在处理横竖屏切换时,可以实现不同布局的适配。在本案例中,“Fragment实现横竖屏布局”主要是指如何利用Fragment来设计适应横竖屏切换的应用界面...
在处理横竖屏切换时,Fragment的管理变得尤为重要。本篇将深入探讨如何在Android中动态创建Fragment以及在横竖屏切换时保持状态。 首先,让我们了解Fragment的基本概念。Fragment是一个可以包含用户界面的模块化...
本示例“Fragment的使用,隐藏显示以及androidPad横竖屏切换”将重点讲解如何操作Fragment以及处理平板设备上的横竖屏切换。 首先,让我们深入理解Fragment的生命周期。Fragment有自己的onCreate(), onCreateView()...
Fragment可以独立地进行生命周期管理,并且可以在不同的屏幕配置变化下保持状态,如横竖屏切换。本教程将深入探讨如何在横竖屏之间实现Fragment的不同展示方式。 首先,理解Fragment的基本概念是至关重要的。...
首先,理解Android系统在横竖屏切换时的行为。当设备的配置(如屏幕方向)发生改变时,系统会默认销毁当前运行的Activity,并重建一个新的实例来适应新的配置。这个过程中,所有与Activity关联的Fragment也会被销毁...
近期项目遇到个横竖屏切换的问题,较为复杂,在此记之。 1、Activity中竖屏嵌套3个Fragment,本文简称竖屏FP1,FP2,FP3。 2、其中竖屏FP1与FP2可以切换为横屏的FL1,FL2,即竖屏FP1切换到对应的横屏FL1,竖屏FP2对应...
通过深入理解以上知识点,并参考“3-12-6(横竖屏切换处理)”的源码,开发者可以更好地处理Android应用中的横竖屏切换问题,实现流畅、无中断的用户体验。同时,源码示例提供了实践操作的机会,有助于加深理论知识的...
在横竖屏切换过程中,Fragment可以帮助我们优雅地管理UI状态,确保用户体验的连贯性。 1. **配置AndroidManifest.xml**:在AndroidManifest.xml文件中,每个Activity都有一个`screenOrientation`属性,用于设置屏幕...
这份"Android横竖屏切换处理Demo源码"提供了一个很好的学习示例,帮助开发者理解和处理这一问题。以下是对这个Demo源码中涉及的知识点的详细解析: 1. **Activity生命周期与横竖屏切换**: 当设备屏幕方向发生变化...
在安卓(Android)系统中,横竖屏切换是应用程序开发中的常见需求,涉及到用户界面(UI)布局的动态调整和程序状态的保存与恢复。本资料"安卓Android源码——(横竖屏切换处理).rar"很可能是针对这一主题的一个实践...
然而,实现这样的功能并不总是那么简单,尤其是在处理屏幕旋转(横竖屏切换)时可能会遇到问题。下面我们将详细讨论如何在Android的WebView中播放网上视频,并处理横竖屏切换。 首先,我们需要了解WebView的基本...
本教程将深入探讨如何在Activity中嵌套Fragment,并实现横竖屏切换。 首先,我们来详细了解一下Activity与Fragment的交互。在Activity中添加Fragment,通常需要执行以下步骤: 1. 在XML布局文件中定义Fragment的...
Fragment允许开发者在Activity中分割用户界面,使得布局在不同设备屏幕尺寸和横竖屏切换时能够灵活适应。本教程将深入探讨如何在手机横竖屏下动态改变Fragment的布局方式,以及使用Android Studio进行相关开发所需的...
每个Fragment可以单独处理横竖屏切换,而Activity主要负责协调。 6. **自定义Activity的启动模式**: - 如果一个Activity不应该在横竖屏切换时重建,可以将其启动模式设置为`singleTask`或`singleInstance`,但这...
4. **捕获横竖屏切换**:如果希望在横竖屏切换时执行某些操作,可以重写`onConfigurationChanged(Configuration newConfig)`方法。当`newConfig.orientation`改变时,表示屏幕方向发生了变化。 5. **防止Activity...
如果Activity中包含Fragment,那么在横竖屏切换时,Fragment的生命周期也会受到影响。需要确保Fragment的数据和状态也能正确保存和恢复。 7. **避免不必要的Activity重建**: 在某些情况下,可能不希望因为屏幕...
Android解决多个Fragment切换时布局重新实例化问题,并保存当前fragment页面,系统回收后还原之前fragment页面,内附源码及apk,博客:http://blog.csdn.net/fan7983377/article/details/51889269