android横竖屏切换和布局的问题

 若android程序横竖屏切换时会弹出小键盘,可以在AndroidManifest.xml中设置activity的如下属性:

anroid:WindowSoftInputMode="stateHidden"

 

在做android或者Ophone开发时,在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新加载画面并显示和横评一样的画面,这样会有2个问题,

    布局问题,在竖屏 显示的布局 到横屏中由于宽和高发生了变化所有多少都会影响到布局(除非你定制2套画面在然后加个判断在横屏时怎么显示,在竖屏时怎么显示),当然最简单的办法就是在 项目的 AndroidManifest.xml中找到你所指定的activity 中加上
          只竖屏显示的话(android:screenOrientation="portrait")
          只横屏显示的话(android:screenOrientation="landscape")
    画面重新载入问题:在默认情况下横竖 切换时会重新载入画面,导致一些不必要的资源浪费,更严重的是画面上保持的数据(特别是游戏方面)也都被重置了(当然你可以在重置前保存这些数据到数据库或者到文本文件中),要怎么避免在横竖 切换时重新载入画面,
          首先要在 AndroidManifest.xml中找到你所指定的activity 中加上android:configChanges="orientation|keyboardHidden"
          然后 在activity的逻辑处理中(代码部分)去重载onConfigurationChanged事件,具体代码参考一下:
                @Override
                      public void onConfigurationChanged(Configuration config) {
                          super.onConfigurationChanged(config);
                      }

以上就可以简单的控制你的app画面的显示方式并且在显示方式不变的情况下横竖 屏切换时不会重新加载画面,即优化的你的app同时用户体验也相应提高了。

 

 

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

2012-03-1511:24:29|  分类: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);

    // Checksthe 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()的方法一样保留变化前的ActivityState,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含ActivityInstance本身。新创建的Activity可以继承大量来至于Parent ActivityState信息。

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

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

使用方法如下:

@Override
public Object onRetainNonConfigurationInstance() {
    finalMyDataObject data = collectMyLoadedData();
    returndata;
}

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

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

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

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

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方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值