需要了解横竖屏切换关键知识

  1.在Android设备的横竖屏幕,每一次切换横竖屏其实是在重新创建Activity,Activity会重新走一遍生命周期.从onCreate 到 onDestroy

  2.在Activity类里的变量也会重新创建,这点需要注意!

判断屏幕方向,方式一

判断屏幕是否竖屏

  @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
L.e("触发竖屏");
}
}

判断屏幕是否横屏

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
L.e("触发横屏");
}
}

判断屏幕是否是未知方向

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_UNDEFINED){
L.e("未定义方向");
}
}

判断屏幕方向,方式二

这个方式其实是监听activity的配置变化时的回调

在activity里重写onConfigurationChanged方法

 @Override
public void onConfigurationChanged(Configuration newConfig) {
L.e("newConfig.orientation="+newConfig.orientation);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
L.e("触发竖屏"); }
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
L.e("触发横屏");
}
super.onConfigurationChanged(newConfig);
}

注意!,这个方法没想象这么简单.这个方法回调的条件:   这个方法要求,切换横竖屏不在重新创建activity,就是activity不会再次onCreate,才会回调这个方法.所以正常情况下,你无法在横竖屏后触发这个回调.

为了触发这个回调,我们需要在AndroidManifest.xml给目标Activity添加属性 android:configChanges="orientation|screenSize":

<activity android:name=".test.TestActivity"
android:configChanges="orientation|screenSize"/>

configChanges这个属性控制着,我们activity在某些情况下是不需要重新创建activity的,这里的不重新创建意味着activity的生命周期将保持不变,不会重新走任何一个生命周期包括onResume.

这里设置方向orientation和尺寸screenSize,就会让方向与尺寸改变时不会重新创建activity.当然还有以下几种情况:

  • “mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
  • “mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
  • “locale“ 所在地区发生变化。
  • “touchscreen“ 触摸屏已经改变。(这不应该常发生。)
  • “keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
  • “keyboardHidden“ 用户打开手机硬件键盘
  • “navigation“ 导航型发生了变化。(这不应该常发生。)
  • “orientation“ 设备旋转,横向显示和竖向显示模式切换。
  • “fontScale“ 全局字体大小缩放发生改变

判断屏幕方向,方式三

这个方法其实是最强的,因为它是监听了方向传感器的值.所以它能监听获取任意方向.

我们只要new一个OrientationEventListener,开启就行了.注意它不是接口类,是一个抽象类.

private OrientationEventListener mOrientationEventListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
mOrientationEventListener = new OrientationEventListener(this) { @Override
public void onOrientationChanged(int orientation) {
L.e("onOrientationChanged: " + orientation);
if (orientation > 350 || orientation < 20) { //0度 90 正竖屏 } else if (orientation > 70 && orientation < 110) { //90度 右横屏 } else if (orientation > 160 && orientation < 200) { //180度 倒竖屏 } else if (orientation > 250 && orientation < 290) { //270度 左横屏 } }
};
if (mOrientationEventListener.canDetectOrientation()) {
Log.v(TAG, "可以检测方向");
mOrientationEventListener.enable();//开启
} else {
Log.v(TAG, "无法检测方向");
mOrientationEventListener.disable();
} } @Override
protected void onDestroy() {
super.onDestroy();
mOrientationEventListener.disable();//注销
}

最后注意,在退出时需要注销关闭监听.

另外还有一个更合适在方向监听上使用的,配置参数 SensorManager.SENSOR_DELAY_NORMAL:

mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { //
@Override
public void onOrientationChanged(int orientation) {
L.e("onOrientationChanged: " + orientation); }
};

SensorManager.SENSOR_DELAY_NORMAL 的意思是,让传感器延迟,更适合在方向的监听使用.所以如果你只需要方向上面的监听推荐添加这个参数创建OrientationEventListener.

这样设置延迟的好处是排除一些中间的波动值,返回的值会更加稳定,这样你可以在判断方向时,不会出现在边界值上反反复复切来切去的问题.

设置当前屏幕方向

在activity里写以下任意一个属性

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置屏幕为横屏, 设置后会锁定方向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置屏幕为竖屏, 设置后会锁定方向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//方向未定义, 设置后放弃锁定方向

注意,这里的锁定方向意思是指,用户将无法自己改变这个activity的方向. 包括自动切换屏幕的方向传感器.

  • SCREEN_ORIENTATION_UNSPECIFIED 方向未指定
  • SCREEN_ORIENTATION_LANDSCAPE 方向横屏
  • SCREEN_ORIENTATION_PORTRAIT 方向竖屏
  • SCREEN_ORIENTATION_USER 方向用户
  • SCREEN_ORIENTATION_BEHIND 方向背后
  • SCREEN_ORIENTATION_SENSOR 方向传感器
  • SCREEN_ORIENTATION_NOSENSOR  方向没有传感器
  • SCREEN_ORIENTATION_SENSOR_LANDSCAPE 传感器横向
  • SCREEN_ORIENTATION_SENSOR_PORTRAIT 传感器竖向
  • SCREEN_ORIENTATION_REVERSE_LANDSCAPE 反转横向
  • SCREEN_ORIENTATION_REVERSE_PORTRAIT 反转竖向
  • SCREEN_ORIENTATION_FULL_SENSOR 全传感器
  • SCREEN_ORIENTATION_USER_LANDSCAPE 用户横向
  • SCREEN_ORIENTATION_USER_PORTRAIT 用户竖向
  • SCREEN_ORIENTATION_FULL_USER 方向用户
  • SCREEN_ORIENTATION_LOCKED 方向锁定

end

Android开发 设备横屏与竖屏的详解的更多相关文章

  1. Android强制设置横屏或竖屏

    全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...

  2. 05 Android强制设置横屏或竖屏/全屏

    全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...

  3. (转)Android强制设置横屏或竖屏

    全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TIT ...

  4. Android 强制设置横屏或竖屏 设置全屏

    (转自:http://blog.csdn.net/yuejingjiahong/article/details/6636981) 强制横屏: @Override protected void onRe ...

  5. 整理最全的Android开发工程师面试题,面试题详解。java、Android程序员

    1.    请描述下Activity的生命周期. 必调用的三个方法:onCreate()--> onStart() --> onResume(),用AAA表示 (1)父Activity启动 ...

  6. Android 开发权限设置中英对照说明详解

    android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传( Al ...

  7. Android开发之数据存储——SharedPreferences基础知识详解,饿补学会基本知识,开发者必会它的用法。

    一.数据存储选项:Data Storage --Storage Options[重点] 1.Shared Preferences Store private primitive data in key ...

  8. Android开发重点难点:RelativeLayout(相对布局)详解

    https://i.cnblogs.com/EditPosts.aspx?opt=1 重点知识 和线性布局(LinearLayout)一样,RelaiveLayout相对布局也是我们用的比较多的一个布 ...

  9. JQuery 判断IPad、IPhone、Android是横屏还是竖屏(Window.Orientation实现)

    在ipad.iphone网页开发中,我们很可能需要判断是横屏或者竖屏.下面就来介绍如何用 jQuery 判断iPad.iPhone.Android是横屏还是竖屏的方法. 代码如下: function ...

随机推荐

  1. 'ddkbuild.cmd' 不是内部或外部命令,也不是可运行的程序

    转自VC错误:http://www.vcerror.com/?p=49 问题描述: 错误:'ddkbuild.cmd' 不是内部或外部命令,也不是可运行的程序 解决方法: 详细的解决方法可参考VC错误 ...

  2. [转] 多个文件目录下Makefile的写法

    1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...

  3. DXP 常用功能

    1. PCB布板篇 t+s: 从原理图对应到pcb图中 F11: 修改顶层,底层信息 v+f: 回到PCB板中 i+l: 放置到画的矩形框内 对齐功能: ctrl + shift + t: 顶部对齐 ...

  4. 初探分布式环境的指挥官ZooKeeper

    目录 1. 从单机到集群,分布式环境中的挑战 1.1 集中式的特点 1.2 集中式的痛点 1.3 从单体到SOA的转变 1.4 分布式服务总体框架 1.5 分布式应用概述 2. ZK基本概念及核心原理 ...

  5. java.lang.NoSuchMethodError: com.google.common.hash.HashFunction.hashInt(I)Lcom/google/common/hash/HashCode; 解决办法

    今天在java 上运行spark查询的时候出现一个问题: java.lang.NoSuchMethodError: com.google.common.hash.HashFunction.hashIn ...

  6. Hadoop搭建,上传文件时出现错误,没有到主机的路由

    解决方案:(1)从namenode主机ping其它slaves节点的主机名(注意是slaves节点的主机名),如果ping不通,原因可能是namenode节点的/etc/hosts 未配置主机名与IP ...

  7. Python骚操作(一)

    1. 交换变量值 2. 将列表中所有元素组合成字符串 3. 查找列表中频率最高的值 4. 检查连个字符串是不是由相同字母不同顺序组成 5. 反转字符串 6. 反转列表 7. 转置二维数组 8. 链式比 ...

  8. CentOS7开放防火墙端口

    ~~~~~~~~~~~~开放某个端口~~~~~~~~~~~~firewall-cmd --zone=public --add-port=6669/tcp --permanentfirewall-cmd ...

  9. iOS开发系列-UIImageView的contentMode

    typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, UIViewContentModeScale ...

  10. vue cli3使用webpack4打包优化

    去掉console.log,以及开启gzip const CompressionPlugin = require('compression-webpack-plugin');//引入gzip压缩插件 ...