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

作者:全速前行 时间:2022-06-19 22:11:14 

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

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

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

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

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

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

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

来源:http://blog.csdn.net/lincyang/article/details/45117249

标签:Android,横竖屏切换
0
投稿

猜你喜欢

  • Android自定义View弹性滑动Scroller详解

    2023-08-07 09:56:39
  • Unity3D实现NavMesh导航网格寻路

    2021-07-29 05:38:18
  • java获取注册ip实例

    2023-11-03 23:01:12
  • Android自动编辑文本框(AutoCompleteTextView)使用方法详解

    2023-02-05 18:17:53
  • springmvc 传递和接收数组参数的实例

    2022-12-16 04:03:06
  • Android 屏幕双击事件的捕获简单示例

    2022-08-30 11:02:55
  • 使用java的Calendar对象获得当前日期

    2023-10-11 16:24:23
  • C#使用foreach语句简单遍历数组的方法

    2022-02-07 08:40:24
  • 封装flutter状态管理工具示例详解

    2022-04-17 14:15:56
  • sublime text3搭建配置c语言编译环境的详细图解教程(小白级)

    2021-12-16 09:18:27
  • 浅谈springboot一个service内组件的加载顺序

    2023-12-10 12:47:12
  • 详解Java的回调机制

    2023-07-27 07:17:43
  • android预置默认的语音信箱号码具体实现

    2022-08-22 07:51:59
  • IDEA SpringBoot项目配置热更新的步骤详解(无需每次手动重启服务器)

    2023-11-12 00:22:41
  • macOS下Spring Boot开发环境搭建教程

    2023-11-05 15:50:59
  • SpringSecurity权限控制实现原理解析

    2022-04-05 14:46:27
  • Android基础控件RadioGroup使用方法详解

    2022-08-05 17:43:31
  • 详解Android Scroller与computeScroll的调用机制关系

    2023-09-27 19:49:14
  • Android监听手机电话状态与发送邮件通知来电号码的方法(基于PhoneStateListene实现)

    2022-12-07 09:03:44
  • Springboot通过谷歌Kaptcha 组件生成图形验证码功能

    2021-07-24 23:42:47
  • asp之家 软件编程 m.aspxhome.com