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

所属分类: 软件编程 / Android 阅读数: 112
收藏 0 赞 0 分享

这几年一直在做手机上和电视盒的App,几乎没有考虑过横竖屏切换的问题。电视盒好说,横屏不变,你要是给它设计个竖屏人家也没机会使;而手机上的应用就不好说了,有些界面你设计了横竖屏兼容可能是为了表示你的功能强大。但是按照惯例,或许也是设计师图省事,我们只是做一个方案。就像目前主流的App都只有竖屏一个模式,比如微信、京东和招商银行。我截了几张图表示一下。 

 

zs 

但是像地图之类的应用,也许横屏会显示的更友好一些。请看腾讯地图的设计如下:

dt1 

dt2 

细心的你会发现,地图的横竖屏的样式几乎是一样的布局,调整起来还是比较容易的。我一直也这样认为,横竖屏切换就是一件十分Easy的事儿,但现在我不这样认为了。

因为我可是思考在Android平板上的界面设计了。屏幕大了,横竖屏可以提供不同的表现形式。这是平板与手机的区别。但这样一来,事情就会变得不那么简单了。尤其是大量信息录入的界面,后台有线程工作的时候,都是很难办的事儿。下面是我的一些探索,希望大家多提意见。

生命周期的故事

横竖屏切换的过程,会经历onDestroy和onCreate。通俗点说,就是这个activity关闭了,有新起来一个activity。那么,前一个activity的数据肯定都不存在了。虽然这样的切换,你的EditText上输入的内容还在,但是一定要记得,成员变量都是空的啦。数据保存成了一个问题。

保存整个activity的方案

在Manifest里对于的activity加上这个配置就不会重走销毁和创建了,如下:

android:configChanges="orientation|keyboardHidden|screenSize"

不要高兴的太早,除非你不需要改变横竖屏的布局,否则这个方案仍然要有很多工作要做。

还是乖乖的保存数据吧

onRetainNonConfigurationInstance()被弃用了,我们还是用onSaveInstanceState吧。针对横竖屏不同的布局,我们只需在创建一个layout-land文件夹,里面放同名的布局文件,onCreate时会自动加载相对应的横竖屏布局。
在横竖屏切换的过程中会经历onSaveInstanceState,给你一个保存数据的机会:

  @Override
  public void onSaveInstanceState(Bundle outState) {
    Log.i("linc", "onSaveInstanceState(Bundle)");
    super.onSaveInstanceState(outState);

    outState.putString(TEXT_ONE, ""+editText1.getTag(R.id.tag_first));//avoid null point
//    outState.putSerializable();//object
  }

在onCreate中把数据取出来:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_land_port_switch);
    Log.e("linc","oncreate");
    editText1 = (EditText)findViewById(R.id.txt1);
        // Restore saved state.
    if (savedInstanceState != null) {      editText1.setTag(R.id.tag_first,savedInstanceState.getString(TEXT_ONE));
    }
    }

github上的一个进度条例子

请看这个例子吧,横竖屏切换可以有自己的布局,切换过程中不会打断进度条的工作,用到了Fragment。详情请见这里:
https://github.com/alexjlockwood/worker-fragments

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多