我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android中Activity横竖屏切换的那些事

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android中Activity横竖屏切换的那些事

讲解之前需要说明的是

旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们旋转屏幕 手动设置屏幕:我们自己去调用Activity的 setRequestedOrientation 方法。

设置屏幕的方向

简介

描述
unspecified 默认值。系统自动选择屏幕方向
behind 跟activity堆栈中的下面一个activity的方向一致
landscape 横屏方向,显示的宽比高长
portrait 竖屏方向,显示的高比宽长
sensor 由设备的物理方向传感器决定,如果用户旋转设备,这屏幕就会横竖屏切换
nosensor 忽略物理方向传感器,这样就不会随着用户旋转设备而横竖屏切换了("unspecified"设置除外)
user 用户当前首选的方向
reverseLandscape API 9 以上,反向横屏
reversePortrait API 9 以上,反向竖屏
sensorLandscape API 9 以上,横屏,但是可以根据 物理方向传感器来切换正反向横屏
sensorPortrait API 9 以上,竖屏,但是可以根据 物理方向传感器来切换正反向竖屏
fullSensor API 9 以上,上下左右四个方向,由物理方向传感器决定
locked API 18 以上,锁死当前屏幕的方向

官网文档地址

第一种

我们可以在AndroidManifest 清单文件里面制定Activity的方向


<activity
  android:name=".view.main.MainActivity"
  android:screenOrientation="portrait">
  <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
</activity>

这样横竖屏切换的时候不会重新创建Activity

第二种


setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Android:android:configChanges

如果我们不配置configuration ,当 configuration 发生变化的时候,activity会自动处理它。反之,如果我们配置了相应的 configuration,当新的 configuration 发生变化的时候,会回调 Activity 的 onConfigurationChanged() 方法。

下面我们一起来看一下几个常用的值得介绍,其他不常用的hi请自行查阅文档。官网地址:

描述
keyboardHidden 键盘的可访问性发生变化——例如:用户发现了硬件键盘。
orientation 屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明),你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变。
screenLayout 屏幕布局发生变化——这个会导致显示不同的Activity。屏幕方向发生变化——用户旋转了屏幕。注意:如果应用程序的目标API级别是13或更高(通过属性minSdkVersion和属性targetSdkVersion声明),你也需要声明配置项screenSize,因为这将在设备选择肖像和屏幕方向时发生改变。
screenSize 当前可用屏幕大小发生变化。这代表一个当前可用大小的变化,和当前的比率相关,因此当用户选择不同的画面和图像,会发生变化。然而,如果你的程序目标API级别是12或更低,你的Activity总是会自己处理这个配置变化(这个变化不会引起Activity的重启,甚至在Android 3.2或更新的设备上)。在API级别13里加入的。

android:configChanges 常用配置

在Android 3.2以后,如果我们进行下列的配置 ,这样的话横竖屏不会重新创建Activity,但是会调用 onConfigurationChanged()方法


<activity
  android:name=".view.main.MainActivity"
  android:configChanges="keyboardHidden|orientation|screenSize"
  >
  <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
</activity>
在api 3.2 以前,我们只需这样配置即可,android:configChanges="keyboardHidden|orientation"。
<activity
  android:name=".view.main.MainActivity"
  android:configChanges="keyboardHidden|orientation"
  >
  <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
</activity>

小结

当我们进行了上述的配置,

竖屏 》 横屏 onConfigurationChanged()方法会调用一次 横屏 》 竖屏 onConfigurationChanged()方法也会调用一次

因此我们通常可以进行相应的处理


public void onConfigurationChanged(Configuration newConfig) { 
  super.onConfigurationChanged(newConfig); 
  if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    // 加入横屏要处理的代码 
  } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
    // 加入竖屏要处理的代码 
  } 
}

如果我们同时设置了 android:configChanges="keyboardHidden|orientation|screenSize" 和 android:screenOrientation="portrait",那又会是怎样的呢?

如果我们打开系统的自动旋转屏幕,旋转屏幕,系统不会发生变化,也不会调用 Activity 的 onConfigurationChanged 方法。

当我们手动调用 setRequestedOrientation() 方法去改变屏幕的方向的时候,还是会调用 onConfigurationChanged 方法的

扩展

设置全屏模式


// 去掉ActionBar
requestWindowFeature(Window.FEATURE_NO_TITLE); 
// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

在实际项目中,我们通常会固定我们应用的屏幕方向,只对一些特定的需要切换屏幕的Activity做处理,那我们如何统一设置屏幕的方向呢?

第一种方法,复制张贴,在AndroidManifest清单文件里面的每一个Activity标签增加如下标签。


<activity android:name=".MainActivity"
     android:screenOrientation="portrait"
     >
</activity>

第二种方法,刚开始我直接在 AppTheme 里面 设置 android:screenOrientation,但是没有效果,刚开始我也很纳闷,后面查阅了官网文档,描述如下,才解决了疑问.

Specify the orientation an activity should be run in. If not specified, it will run in the current preferred orientation of the screen. This attribute is supported by the <activity> element.


<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <item name="android:screenOrientation">portrait</item>
</style>

即这种方法不可取

第三种方法,在BaseActivity里面动态设置


public class BaseActivity extends AppCompatActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  }
}

同时列出这三种方法,最主要的目的不是为了告诉大家有这几种方法可以统一设置屏幕的方向,最重要的是告诉大家一种思想吧。通常在xml 文件可以设置的,在java 代码也可以设置。

利用系统的加载机制自动帮我们加载相应的布局

如果大家在资源目录res 中添加了 layout-land(横向布局文件夹) 和 layout-port (竖想布局文件夹),重启Activity模式的横竖屏切换,

可能有人会有这样的疑问,当我们设置了Activity的方向为竖屏或者横屏的时候,旋转屏幕并不会重新调用Activity的各个生命周期,那我们要怎样检测呢?

其实很简单,那就是利用我们的传感器,然后根据旋转的方向做相应的处理


//注册重力感应器 屏幕旋转
mSm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSm.registerListener(mOrientationSensorListener, mSensor, SensorManager.SENSOR_DELAY_UI);

public class OrientationSensorListener implements SensorEventListener {
  private static final int _DATA_X = 0;
  private static final int _DATA_Y = 1;
  private static final int _DATA_Z = 2;
  public static final int ORIENTATION_UNKNOWN = -1;
  private boolean sensor_flag = true;
  public static final String TAG = "xujun";
  int mLastAngle=-1;
  AngleChangleListener mAngleChangleListener;
  public OrientationSensorListener(AngleChangleListener angleChangleListener){
    mAngleChangleListener=angleChangleListener;
  }
  @Override
  public void onAccuracyChanged(Sensor arg0, int arg1) {
    // TODO Auto-generated method stub
  }
  @Override
  public void onSensorChanged(SensorEvent event) {
    float[] values = event.values;
    int orientation = ORIENTATION_UNKNOWN;
    float X = -values[_DATA_X];
    float Y = -values[_DATA_Y];
    float Z = -values[_DATA_Z];
    
    float magnitude = X * X + Y * Y;
    // Don't trust the angle if the magnitude is small compared to the y value
    if (magnitude * 4 >= Z * Z) {
      //屏幕旋转时
      float OneEightyOverPi = 57.29577957855f;
      float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi;
      orientation = 90 - (int) Math.round(angle);
      // normalize to 0 - 359 range
      while (orientation >= 360) {
        orientation -= 360;
      }
      while (orientation < 0) {
        orientation += 360;
      }
    }
    if (orientation > 225 && orientation < 315) { //横屏
      sensor_flag = false;
    } else if ((orientation > 315 && orientation < 360) || (orientation > 0 &&
        orientation < 45)) { //竖屏
      sensor_flag = true;
    }
//    Log.i(TAG, "onSensorChanged: orientation=" + orientation+"  mLastAngle="+mLastAngle);
    if(mLastAngle!=orientation && mAngleChangleListener!=null){
      mAngleChangleListener.onChange(orientation);
      mLastAngle=orientation;
    }
  }
}

设备旋转时保存Activity的交互状态

大家先看一下Activity的生命周期,我们知道如果我们不配置Activity的方向或者Activity的 android:configchang 属性的时候,每次旋转屏幕,Activity都会重新被创建出来。那我们要如何保存我们当前的状态呢。

其实我们可以考虑在 onPause() 或者在 onStop() 里面保存我们相应的数据,再在onCreate() 方法里面判断 savedInstanceState 是否有缓存我们的数据即可。 至于选择在onPause() 还是 onStop() 保存数据,得看具体的需求分析。 onPause() 在界面失去焦点的时候会回调, onStop() 方法在界面完全不可见的时候会回调。


private static final String KEY_INDEX = "index";
private int mCurrentIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
  if (savedInstanceState != null) {
    mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
  }
}
@Override
protected void onPause(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putInt(KEY_INDEX, mCurrentIndex);
}

Demo 下载地址:ScreenDemo_jb51.rar

您可能感兴趣的文章:android横竖屏切换不重启activity解决方案android横竖屏切换时候Activity的生命周期android实现在横竖屏切换时页面信息不被重置的示例分享Android Activity 横竖屏切换的生命周期解析Android横竖屏切换的问题Android横竖屏幕切换小结Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法解决Android横竖屏切换数据丢失问题的方法Android实现横竖屏切换的实例代码Android横竖屏切换及其对应布局加载问题详解


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android中Activity横竖屏切换的那些事

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android中Activity横竖屏切换的那些事

讲解之前需要说明的是旋转屏幕:在系统的自动旋转屏幕开启的情况下,我们旋转屏幕手动设置屏幕:我们自己去调用Activity的 setRequestedOrientation 方法。 设置屏幕的方向 简介值描述unspecified默认值。系统
2022-06-06

Android Activity 横竖屏切换的生命周期

前言 在开发中常要处理横竖屏切换,怎么处理先看生命周期 申明 Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下onSaveInstanceSta
2022-06-06

Android Activity横竖屏切换生命周期详解

关于Activity生命周期和横竖屏切换时,生命周期的执行过程,网上有很多文章。但是都写的很模糊,并且不完善。一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码设置。文章通过以上方面解析
2022-06-06

android横竖屏切换时候Activity的生命周期

1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3、按crtl+f12切换成横屏时 onSaveInstanceState
2022-06-06

怎么在android中利用Activity进行横竖屏切换

这篇文章给大家介绍怎么在android中利用Activity进行横竖屏切换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。设置屏幕的方向简介值描述unspecified默认值。系统自动选择屏幕方向behind跟activ
2023-05-31

android横竖屏切换不重启activity解决方案

部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCreate方法,我们可以在androidmanifest.xml中的activit元素加入这个属性An
2022-06-06

解析Android横竖屏切换的问题

在做android 开发时,在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新加载画面并显示和横评一样的画面,这样会有2个问题,布局问题,在竖屏 显示的布局到横屏中由于宽和高发生
2022-06-06

Android禁止横屏竖屏切换的有效方法

在Android中要让一个程序的界面始终保持一个方向,不随手机方向转动而变化的办法: 只要在AndroidManifest.xml里面配置一下就可以了。 在AndroidManifest.xml的activity(需要禁止转向的activi
2022-06-06

Android应用中是如何实现横竖屏切换的

这篇文章给大家介绍Android应用中是如何实现横竖屏切换的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。横竖屏切换的过程,会经历onDestroy和onCreate。通俗点说,就是这个activity关闭了,有新起来
2023-05-31

Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法

本文实例讲述了Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法。分享给大家供大家参考,具体如下: 首先在Mainifest.xml的Activity元素中加入android:configChanges="orie
2022-06-06

Android中怎么实现横竖屏幕切换生命周期

Android中怎么实现横竖屏幕切换生命周期,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、简介二、代码/activityLifeCycle_3Screen/Androi
2023-05-30

解决Android横竖屏切换数据丢失问题的方法

Android横竖屏切换时,当前的Activity会被销毁,然后Activity上面的数据将会全部丢失。 如Listview上面每个item的checkbox,横竖屏切换时,复选框就丢失所有选中信息。 解决方案1:在Androidmanif
2022-06-06

Android(2.2/2.3系统)Gallery解决默认和横竖屏切换选中状态问题

前言 Gallery的Item使用的是一个ImageView+TextView,并且为其设置了selector,当使用setSelection设置时、横竖屏切换时Item的状态不会改变,这个目前在2.2/2.3系统中存在,高版本如4.0是
2022-06-06

android实现在横竖屏切换时页面信息不被重置的示例分享

当屏幕转动切换的时候 Android 机制是:销毁当前屏幕的 Activity ,然后重新开启一个新的适应屏幕改变的 Activity 。那么,我们该如何在屏幕切换的时候页面信息不被重置呢? 解决实现:1.在 AnroidMainifest
2022-06-06

Android 应用中如何处理播放器的横屏切换问题

本篇文章给大家分享的是有关Android 应用中如何处理播放器的横屏切换问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1 在播放中如何处理播放器的横屏切换 和 播放器上的文
2023-05-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录