`

Fragment 横竖屏切换问题

阅读更多
在默认情况下当发生横竖屏切换时,当前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横竖屏切换demo"是一个实际操作的例子,展示了如何利用Fragment来实现横竖屏切换,从而适应不同设备的屏幕方向变化。 在Android系统中,当设备屏幕方向发生变化时,系统默认会重新创建Activity以及...

    Fragment实现横竖屏布局

    Fragment的设计使得应用在不同设备和屏幕尺寸上表现得更加灵活,尤其在处理横竖屏切换时,可以实现不同布局的适配。在本案例中,“Fragment实现横竖屏布局”主要是指如何利用Fragment来设计适应横竖屏切换的应用界面...

    android动态创建fragment,横竖屏切换.

    在处理横竖屏切换时,Fragment的管理变得尤为重要。本篇将深入探讨如何在Android中动态创建Fragment以及在横竖屏切换时保持状态。 首先,让我们了解Fragment的基本概念。Fragment是一个可以包含用户界面的模块化...

    Fragment的使用,隐藏显示以及androidPad横竖屏切换

    本示例“Fragment的使用,隐藏显示以及androidPad横竖屏切换”将重点讲解如何操作Fragment以及处理平板设备上的横竖屏切换。 首先,让我们深入理解Fragment的生命周期。Fragment有自己的onCreate(), onCreateView()...

    Fragment实现横竖屏的不同实现

    Fragment可以独立地进行生命周期管理,并且可以在不同的屏幕配置变化下保持状态,如横竖屏切换。本教程将深入探讨如何在横竖屏之间实现Fragment的不同展示方式。 首先,理解Fragment的基本概念是至关重要的。...

    浅谈android Fragment横竖屏翻转对重新加载的要求

    首先,理解Android系统在横竖屏切换时的行为。当设备的配置(如屏幕方向)发生改变时,系统会默认销毁当前运行的Activity,并重建一个新的实例来适应新的配置。这个过程中,所有与Activity关联的Fragment也会被销毁...

    Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法

    近期项目遇到个横竖屏切换的问题,较为复杂,在此记之。 1、Activity中竖屏嵌套3个Fragment,本文简称竖屏FP1,FP2,FP3。 2、其中竖屏FP1与FP2可以切换为横屏的FL1,FL2,即竖屏FP1切换到对应的横屏FL1,竖屏FP2对应...

    Android应用源码之(横竖屏切换处理).zip

    通过深入理解以上知识点,并参考“3-12-6(横竖屏切换处理)”的源码,开发者可以更好地处理Android应用中的横竖屏切换问题,实现流畅、无中断的用户体验。同时,源码示例提供了实践操作的机会,有助于加深理论知识的...

    安卓横竖屏幕切换

    在横竖屏切换过程中,Fragment可以帮助我们优雅地管理UI状态,确保用户体验的连贯性。 1. **配置AndroidManifest.xml**:在AndroidManifest.xml文件中,每个Activity都有一个`screenOrientation`属性,用于设置屏幕...

    Android横竖屏切换处理Demo源码.rar

    这份"Android横竖屏切换处理Demo源码"提供了一个很好的学习示例,帮助开发者理解和处理这一问题。以下是对这个Demo源码中涉及的知识点的详细解析: 1. **Activity生命周期与横竖屏切换**: 当设备屏幕方向发生变化...

    安卓Android源码——(横竖屏切换处理).rar

    在安卓(Android)系统中,横竖屏切换是应用程序开发中的常见需求,涉及到用户界面(UI)布局的动态调整和程序状态的保存与恢复。本资料"安卓Android源码——(横竖屏切换处理).rar"很可能是针对这一主题的一个实践...

    Android中WebView播放网上视频,横竖屏切换

    然而,实现这样的功能并不总是那么简单,尤其是在处理屏幕旋转(横竖屏切换)时可能会遇到问题。下面我们将详细讨论如何在Android的WebView中播放网上视频,并处理横竖屏切换。 首先,我们需要了解WebView的基本...

    Android Activity嵌套Fragmnet实现横竖屏切换

    本教程将深入探讨如何在Activity中嵌套Fragment,并实现横竖屏切换。 首先,我们来详细了解一下Activity与Fragment的交互。在Activity中添加Fragment,通常需要执行以下步骤: 1. 在XML布局文件中定义Fragment的...

    fragment在手机横竖屏下动态的改变布局方式

    Fragment允许开发者在Activity中分割用户界面,使得布局在不同设备屏幕尺寸和横竖屏切换时能够灵活适应。本教程将深入探讨如何在手机横竖屏下动态改变Fragment的布局方式,以及使用Android Studio进行相关开发所需的...

    android 横竖屏切换的处理

    每个Fragment可以单独处理横竖屏切换,而Activity主要负责协调。 6. **自定义Activity的启动模式**: - 如果一个Activity不应该在横竖屏切换时重建,可以将其启动模式设置为`singleTask`或`singleInstance`,但这...

    activity横竖屏切换时销毁的处理

    4. **捕获横竖屏切换**:如果希望在横竖屏切换时执行某些操作,可以重写`onConfigurationChanged(Configuration newConfig)`方法。当`newConfig.orientation`改变时,表示屏幕方向发生了变化。 5. **防止Activity...

    3-12-6(横竖屏切换处理).zip

    如果Activity中包含Fragment,那么在横竖屏切换时,Fragment的生命周期也会受到影响。需要确保Fragment的数据和状态也能正确保存和恢复。 7. **避免不必要的Activity重建**: 在某些情况下,可能不希望因为屏幕...

    Android解决多个Fragment切换时布局重新实例化问题,并保存当前fragment页面,系统回收后还原之前fragment页面,内附源码及apk

    Android解决多个Fragment切换时布局重新实例化问题,并保存当前fragment页面,系统回收后还原之前fragment页面,内附源码及apk,博客:http://blog.csdn.net/fan7983377/article/details/51889269

Global site tag (gtag.js) - Google Analytics