Android实战技巧之二十四:横竖屏切换

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

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

细心的你会发现,地图的横竖屏的样式几乎是一样的布局,调整起来还是比较容易的。我一直也这样认为,横竖屏切换就是一件十分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

时间: 2024-11-08 20:12:41

Android实战技巧之二十四:横竖屏切换的相关文章

Android实战技巧之二十六:persistableMode与Activity的持久化

API 21为Activity增加了一个新的属性,只要将其设置成persistAcrossReboots,activity就有了持久化的能力,另外需要配合一个新的bundle才行,那就是PersistableBundle. 这里的持久化与传统意义的不同,它的具体实现在Activity重载的onSaveInstanceState.onRestoreInstanceState和onCreate方法. public void onSaveInstanceState(Bundle outState, P

Android实战技巧之二十九:画布Canvas

Android Framework提供了一些2D画图的API,android.graphics包就是其中之一. 为了画一些东西,需要4个元素(或称组件)协同来完成: * 位图:Bitmap来保持(hold)那些像素 * 画布:Canvas来响应画画(draw)的调用(并将其写入bitmap) * 画笔:paint描述画画的颜色和样式等 * "颜料":drawing primitive,比如矩形.路径.文字.位图等其他元素 而这其中Canvas是比较重要的一环,今天就来演示Canvas的

Android实战技巧之二十五:模拟器如何重启?试试Genymotion!

需要测试Android 5.1系统重启后的一个功能,我手里的设备都没有这么高的版本,那么只好向模拟器求助了.就像大多网友一样,我遇到了一个大问题,如何将Android模拟器重启? 我有几个想法: * 长按模拟器的power kay,调出重启键.可惜的是系统默认只有poweroff一项. * adb reboot或者adb shell进入模拟器再执行reboot.尝试了几个模拟器,都没有成功,只听见我本子的cpu风扇在飞速的运转着. * 自己写一个重启的小应用做重启这件事.这是几年前我就想写的程序

Android实战技巧之二十二:Android 5.1 SDK下载与配置

重要文件下载地址: (1)http://dl-ssl.google.com/android/repository/sources-22_r01.zip (2)http://dl-ssl.google.com/android/repository/tools_r24.1.2-windows.zip (3)http://dl-ssl.google.com/android/repository/android-22_r01.zip (4)http://dl-ssl.google.com/android

Android实战技巧之二十八:启动另一个App/apk中的Activity

Android提供了在一个App中启动另一个App中的Activity的能力,这使我们的程序很容易就可以调用其他程序的功能,从而就丰富了我们App的功能.比如在微信中发送一个位置信息,对方可以点击这个位置信息启动腾讯地图并导航.这个场景在现实中作用很大,尤其是朋友在陌生的环境找不到对方时,这个功能简直就是救星. 本来想把本文的名字叫启动另一个进程中的Activity,觉得这样才有逼格.因为每个App都会运行在自己的虚拟机中,每个虚拟机跑在一个进程中.但仔细一想,能够称为一个进程,前提是这个App

Android实战技巧之二十:两个开源的图表/报表控件

项目中要用饼图和折线图表示数据,重造轮子不是咱风格,先了解一下时下比较流行的开源图表控件吧.调查发现有三个口碑不错的开源项目,它们是MPAndroidChart.AChartEngine.HoloGraphLibrary.由于AChartEngine源码放在code.google上,遂先放弃它,主要研究其他两个在github上的项目. HoloGraphLibrary 项目地址:https://github.com/Androguide/HoloGraphLibrary 简介:这是一个十分简单的

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

Android实战技巧之二十七:Maven编译开源二维码扫描项目zxing

拥有自己的手机软件工具箱是件非常有意义的事情.就目前国内Android的生态环境来说,混乱的不能再乱了.由于我们登录不了官网App商店,下软件就只好在国内五花八门的软件市场下载.由于这些市场的监管不力,什么样的软件都有,就拿二维码扫描软件来说,好多都带那种狗皮膏药一样的广告插件,真是特别讨厌. 在开源世界中有很多优秀的软件,其中zxing就是非常好的Android扫碼工具软件.我们可以拿来即用还可以学习内部机制,然后做些定制化个性化.既可以自己享用,又可以跟大家分享.真是不错. zxing在gi

Android开发系列(二十四):Notification的功能与用法

关于消息的提示有两种:一种是Toast,一种就是Notification.前者维持的时间比较短暂,后者维持的时间比较长. 而且我们平常手机的应用比如网易.贴吧等等都有很多的推送消息,就是用Notification实现的. Notification是显示在手机状态栏的通知-手机状态栏位于手机屏幕的上方.程序一般通过NotificationManager服务来发送Notification通知 Notification的一些方法,接下来我们都能够用到: setDefaults():设置通知LED等.音