`

android: 横竖屏切换总结-布局改变和数据保存

    博客分类:
  • UI
阅读更多

目录:
引言
一、布局问题
二、重新载入问题

三、Q:横竖屏生命周期的切换有可能是什么样的?



        Activity在Configuration变化(比如设备横竖屏切换)时会重启Activity,即会执行onDestory()周期函数,然后onCreate(),重新创建Activity。这是因为这样可以让Activity动态适应Configuration,比如横屏时使用横屏的layout,drawable等resources,竖屏时使用竖屏的layout,drawable等resources。
      (BTW,彻底禁止翻转,可以设置android:screenOrientation的属性为nosensor)

      重启Activity可能导致布局长宽不合适,也可能导致大量数据的重新获取,网络连接的重新建立等问题,用户体验非常差。所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置。

     所以,Android横竖屏切换要解决的问题就两个:布局问题;二、重新载入问题。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、布局问题

1.禁止切换横屏或竖屏

        可以在配置Activity的地方进行如下的配置

        android:screenOrientation="portrait"

        android:screenOrientation="landscape" 

或者 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

这样就可以保证是竖屏总是竖屏了,或者横屏总是横屏。

2.可以切换横屏或竖屏

若要软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局:

1)layout-land和layout-port

      在res目录下建立layout-land(横屏的layout)和layout-port(竖屏的layout)目录,相应的layout文件不变,比如main.xml。其他的不用管,模拟器会自动寻找。

2)onCreate()中判断横竖屏

     通过this.getResources().getConfiguration().orientation判断当前是横屏还是竖屏,然后加载相应的xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的 OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml. 
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
Log.i("info", "landscape"); 

else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
Log.i("info", "portrait");

}

3)横竖屏切换用onConfigurationChanged

         这种方法缺点是动态适应差。比如横竖屏切换时需要你自己写代码来使用不同的layout等resource,语言设置的动态改变等,不推荐.

首先要在配置Activity的时候进行如下的配置:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

另外需要重写Activity的onConfigurationChanged方法。实现方式如下,不需要做太多的内容:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

        ....

   } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();

        .....
    }
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、重新载入问题

1.不需要新载入

在androidmanifest.xml中加入配置android:configChanges="orientation|keyboardHidden"
横竖屏切换时调用onConfigurationChanged(Configuration newConfig)

注意:当横屏变竖屏的时候,他会调用两次onConfigurationChanged,而竖屏转横屏时他只调用一次。

2.新载入,保存之前数据不变onSaveInstanceState()onRestoreInstanceState() 

Android横竖屏切换时会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState。
注意  :
   *
我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。

3.新载入,保存之前数据不变onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()         

     需要在重新载入过程中保存之前的操作内容或数据,则需要保存之前的数据。然后在activity的 onCreate()中取出来。当然,如此就不能设置android:configChanges()了,否则就不会调用onCreate()方法。那么 数据可以保存在哪呢?Android中四种存储方法都可以。  

     还可以用Android为我们提供了onRetainNonConfigurationInstance()方法来暂时保存数据。
     当Device configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。

onRetainNonConfigurationInstance这个方法最大的好处是: 
    * 当Activity曾经通过某个资源得到一些图片或者信息,那么当再次恢复后,无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。 
    * 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。 
    * 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。

注意
    
     * 我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。    
    * onRetainNonConfigurationInstance()在onSaveInstanceState()之后被调用。 
    * 调用顺序同样介于onStop() 和 onDestroy()之间。 

使用方法如下:

@Override
public Object onRetainNonConfigurationInstance() {
    final MyDataObject data = collectMyLoadedData();
    return data;
}

        在onCreate()中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
    if (data == null) {
        data = loadMyData();
    }
    ...
}

 

需要注意的是,onConfigurationChanged函数中只能获得横竖屏切换后的参数,在该函数中获取不到新的Layout和控件的尺寸位置信息,如果要处理尺寸和位置信息,必须通过消息异步或者延时调用,下面是我在项目需要横竖屏切换时需要重新设置popupWindow位置的代码:

       @Override

       protected void onConfigurationChanged(Configuration newConfig) {

              // TODO Auto-generated method stub

              super.onConfigurationChanged(newConfig);

              //View中不用创建Handler,可直接调用post操作

//            new Handler().postDelayed(new Runnable() {

//                   @Override

//                   public void run() {

//                          updatePopup();     

//                   }

//            }, 500);

              postDelayed(new Runnable() {

                     @Override

                     public void run() {

                            updatePopup();      //

                     }

              }, 500);//尝试过直接使用post操作,在updatePopup函数中也能获取正确位置

             

       }

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Q:横竖屏生命周期的切换有可能是什么样的?

a、不设置Activityandroid:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。

如下:启动一个Activity,

onCreate()

onStart()

onResume()

竖屏切换到横屏:(调用一次生命周期)

onSaveInstanceState()

onPause()

onStop()

onDestroy()

onCreate()

onStart()

onRestoreInstanceState()

onResume()

 

横屏切换到竖屏:(调用两次生命周期)

onSaveInstanceState()

onPause()

onStop()

onDestroy()

onCreate()

onStart()

onRestoreInstanceState()

onResume()

onSaveInstanceState()

onPause()

onStop()

onDestroy()

onCreate()

onStart()

onRestoreInstanceState()

onResume()


b
、设置Activityandroid:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。


c
、设置Activityandroid:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

分享到:
评论

相关推荐

    Android应用源码之(横竖屏切换处理-IT计算机-毕业设计.zip

    在Android应用开发中,横竖屏切换是一项基本且重要的功能,尤其对于那些需要根据屏幕方向提供不同用户体验的应用来说。这份"Android应用源码之(横竖屏切换处理)"的资源,是一个非常适合毕业设计学习的示例,可以帮助...

    Fragment实现横竖屏布局

    如果希望在横竖屏切换时改变Fragment的布局,可以通过以下方式: - 在Fragment的onCreateView()方法中根据当前屏幕方向加载不同的布局文件。可以使用`getResources().getConfiguration().orientation`来判断屏幕...

    android横竖屏切换

    通过以上讲解,我们可以理解Android横竖屏切换的基本原理和实践技巧。这个Demo提供了一个实际的示例,帮助开发者更好地理解和掌握这一功能的实现。在实际项目中,根据具体需求灵活运用这些知识,可以提升应用的用户...

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

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

    【Android每周专题】横竖屏切换

    在Android开发中,横竖屏切换是一个常见的需求,尤其对于那些需要根据屏幕方向提供不同界面布局的应用来说。本文将深入探讨Android系统中的横竖屏切换机制,并通过"OrientationSwitchDemo"这个示例代码来帮助理解。 ...

    fragment横竖屏切换demo

    总之,"fragment横竖屏切换demo"项目提供了关于如何在Android中使用Fragment处理屏幕方向变化的实际示例,涉及到了Fragment的生命周期管理、状态保存、布局调整以及与Activity的通信等多个关键知识点。在实际开发中...

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

    在Android系统中,横竖屏切换默认会导致Activity重建,这可能导致UI布局的改变和应用数据的丢失。因此,开发者需要对此进行妥善处理,确保用户体验的连续性。以下是横竖屏切换处理的关键知识点: 1. **配置变更...

    Android横竖屏切换

    综上所述,Android横竖屏切换涉及到布局文件的适配、配置变化的处理、数据的保存与恢复等多个方面,开发者需要根据应用的具体需求来灵活应对。合理的处理方式可以确保用户体验的平滑过渡,同时避免不必要的资源浪费...

    安卓 横竖屏切换源程序

    在Android开发中,横竖屏切换是一个常见的需求,尤其对于那些需要优化用户界面展示的应用来说。这个"安卓横竖屏切换源程序"提供了一个可复用的解决方案,可以帮助开发者轻松地将横竖屏切换功能集成到自己的应用中。...

    横竖屏切换Activity生命周期

    - **数据持久化**:确保在横竖屏切换时,重要的数据能被正确保存和恢复,以避免用户操作的丢失。 - **性能优化**:避免在`onCreate()`和`onStart()`中执行过多的初始化操作,因为这些方法在横竖屏切换时会被频繁调用...

    安卓横竖屏幕切换

    通过以上步骤和策略,我们可以利用Fragment有效地处理Android应用的横竖屏切换,确保用户在不同屏幕方向下都能获得良好的体验。记住,关键是理解Fragment的生命周期和配置变化处理,以及如何在不同屏幕尺寸和方向下...

    Android实现横竖屏切换的实例代码

    在本文中,我们将讨论 Android 实现横竖屏切换的实例代码,并探索横竖屏切换的生命周期和数据保存问题。 生命周期的故事 在 Android 中,屏幕方向的改变会导致 Activity 的重新创建,销毁和重建。这意味着, ...

    android横竖屏总结.doc

    总之,处理Android横竖屏切换涉及对布局的适配和Activity生命周期的理解。正确设置`AndroidManifest.xml`中的配置以及在代码中灵活处理布局加载和状态保存,是实现良好横竖屏切换体验的关键。开发者需要根据具体需求...

    android横竖屏切换不重启activity解决方案

    通过以上两个步骤,Activity在横竖屏切换时将不再重新创建,而是直接调用`onConfigurationChanged()`,使得Activity的状态得以保留,避免了数据丢失和用户体验中断的问题。 需要注意的是,虽然这种方式可以避免...

    android横竖屏切换[文].pdf

    在Android开发中,横竖屏切换是一个常见的需求,它涉及到用户界面布局的适应性和用户体验。以下将详细讲解如何实现Android应用程序中的横竖屏切换,并讨论两种主要方法。 首先,我们来了解一下基本概念。Android...

    Android横竖屏切换实例总结

    总结,Android横竖屏切换涉及多个方面,包括通过XML配置文件或Java代码控制屏幕方向,利用资源定向创建不同的布局,以及通过`onConfigurationChanged`方法处理屏幕变化时的逻辑。开发者应根据实际需求选择合适的策略...

    横竖屏之间切换

    总的来说,处理横竖屏切换涉及对Android Activity生命周期的理解、布局的适应性设计、状态保存和恢复,以及对数据加载策略的考虑。熟练掌握这些技巧将有助于构建健壮且用户体验优秀的Android应用。

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

    在安卓(Android)系统中,横竖屏切换是应用程序开发中的常见需求,它涉及到用户界面(UI)的适配和应用程序逻辑的处理。本压缩包文件"安卓Android源码——(横竖屏切换处理).zip"包含了一个示例,详细讲解了如何在...

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

    总结起来,横竖屏切换处理是Android开发中的一个核心环节,涉及到了活动生命周期、资源配置、布局适配等多个方面。理解和熟练掌握这些知识点,将有助于构建出更加健壮、适应性强的Android应用。

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

    综上所述,处理Activity的横竖屏切换需要考虑数据保存、状态恢复、配置变更处理策略等多个方面。合理地应对这一场景,不仅能保证应用的正常运行,还能提供更好的用户体验。在实际开发中,应根据项目需求灵活运用上述...

Global site tag (gtag.js) - Google Analytics