iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在android中利用Activity进行横竖屏切换
  • 189
分享到

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

activityandroidroi 2023-05-31 08:05:12 189人浏览 独家记忆
摘要

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

这篇文章给大家介绍怎么在Android中利用Activity进行横竖屏切换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

设置屏幕的方向

简介

描述
unspecified默认值。系统自动选择屏幕方向
behind跟activity堆栈中的下面一个activity的方向一致
landscape横屏方向,显示的宽比高长
portrait竖屏方向,显示的高比宽长
sensor由设备的物理方向传感器决定,如果用户旋转设备,这屏幕就会横竖屏切换
nosensor忽略物理方向传感器,这样就不会随着用户旋转设备而横竖屏切换了("unspecified"设置除外)
user用户当前首选的方向
reverseLandscapeapi 9 以上,反向横屏
reversePortraitAPI 9 以上,反向竖屏
sensorLandscapeAPI 9 以上,横屏,但是可以根据 物理方向传感器来切换正反向横屏
sensorPortraitAPI 9 以上,竖屏,但是可以根据 物理方向传感器来切换正反向竖屏
fullSensorAPI 9 以上,上下左右四个方向,由物理方向传感器决定
lockedAPI 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>

小结

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

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

  2. 横屏 》 竖屏 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 方法的

扩展

设置全屏模式

// 去掉ActionBarrequestWindowFeature(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的交互状态

怎么在android中利用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;@Overrideprotected void onCreate(Bundle savedInstanceState) {  if (savedInstanceState != null) {    mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);  }}@Overrideprotected void onPause(Bundle outState) {  super.onSaveInstanceState(outState);  outState.putInt(KEY_INDEX, mCurrentIndex);}

关于怎么在android中利用Activity进行横竖屏切换就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在android中利用Activity进行横竖屏切换

本文链接: https://www.lsjlt.com/news/224578.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么在android中利用Activity进行横竖屏切换
    这篇文章给大家介绍怎么在android中利用Activity进行横竖屏切换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。设置屏幕的方向简介值描述unspecified默认值。系统自动选择屏幕方向behind跟activ...
    99+
    2023-05-31
    activity android roi
  • Android应用怎么实现屏幕横竖屏切换功能
    Android应用怎么实现屏幕横竖屏切换功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 在AndroidManifest.xml中为Activity设置config...
    99+
    2023-05-31
    android roi
  • Android中怎么实现横竖屏幕切换生命周期
    Android中怎么实现横竖屏幕切换生命周期,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、简介二、代码/activityLifeCycle_3Screen/Androi...
    99+
    2023-05-30
    android
  • 怎么在Android应用中利用Activity对动画进行切换
    今天就跟大家聊聊有关怎么在Android应用中利用Activity对动画进行切换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android Activity切换动画Android ...
    99+
    2023-05-31
    android activity roi
  • 怎么在Android应用中实现一个强制横屏或强制竖屏功能
    这期内容当中小编将会给大家带来有关怎么在Android应用中实现一个强制横屏或强制竖屏功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。强制竖屏设置代码在Activity的onResume方法中添加如下代...
    99+
    2023-05-31
    android roi
  • 怎么在Android中利用activity与view对滑动进行判断
    这篇文章给大家介绍怎么在Android中利用activity与view对滑动进行判断,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android activity和view判断滑动//手指按下的点为(x1, y1)手指...
    99+
    2023-05-31
    android activity view
  • 怎么在Android中利用 ksoap2对WebService进行调用
    本篇文章给大家分享的是有关怎么在Android中利用 ksoap2对WebService进行调用 ,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。下载 ksoap2 的 jar ...
    99+
    2023-05-30
    ksoap2 android webservice
  • 怎么在Android中利用ClassLoader对类进行加载
    本篇文章给大家分享的是有关怎么在Android中利用ClassLoader对类进行加载,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的类加载设计了一套双亲代理的模式,使...
    99+
    2023-05-31
    classloader android roi
  • 怎么在Android中利用 listview对数据进行显示
    怎么在Android中利用 listview对数据进行显示?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android  listview数据显示及提示信息...
    99+
    2023-05-31
    android listview roi
  • 怎么在Android中利用SpannableString对内容进行格式化
    这篇文章将为大家详细讲解有关怎么在Android中利用SpannableString对内容进行格式化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。要实现的效果:将话题进行变色并且可以点击提示...
    99+
    2023-05-31
    android spannablestring les
  • 怎么在golang中利用Cast组件对类型进行转换
    这篇文章主要为大家详细介绍了怎么在golang中利用Cast组件对类型进行转换,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,...
    99+
    2023-06-06
  • 怎么在Android应用中利用Bitmap对图片进行优化
    这篇文章给大家介绍怎么在Android应用中利用Bitmap对图片进行优化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎...
    99+
    2023-05-31
    android roi bitmap
  • 怎么在Android中利用LeakCanary对内存泄漏进行排查
    今天就跟大家聊聊有关怎么在Android中利用LeakCanary对内存泄漏进行排查,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在 build.gralde 里加上依赖, 然后sy...
    99+
    2023-05-31
    android 内存泄漏 leakcanary
  • 怎么在Android中利用RSA算法进行加密和解密
    这期内容当中小编将会给大家带来有关怎么在Android中利用RSA算法进行加密和解密,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、公钥加密和私钥解密    pu...
    99+
    2023-05-30
    android rsa
  • 怎么在Android中利用EditText对内容进行分割输入
    怎么在Android中利用EditText对内容进行分割输入?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。自定义EditTextpublic class ContentWi...
    99+
    2023-05-31
    android edittext roi
  • 怎么在Android 开发中利用TextView对文字进行加粗
    这篇文章将为大家详细讲解有关怎么在Android 开发中利用TextView对文字进行加粗,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先自定义一个StyleSpan,在StyleSpan...
    99+
    2023-05-31
    android textview roi
  • 怎么在Android中利用构造函数对View进行自定义
    本篇文章给大家分享的是有关怎么在Android中利用构造函数对View进行自定义,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。自定义View有三个构造方法,它们的作用是不同的。...
    99+
    2023-05-31
    android view roi
  • 怎么在Android中利用videoview对抢占的焦点进行处理
    这篇文章给大家介绍怎么在Android中利用videoview对抢占的焦点进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。问题描述:android 机顶盒应用:应用程序主界面(MainActivity)只有两个控...
    99+
    2023-05-31
    android videoview roi
  • 怎么在Java中利用SimpleDateFormat对英文时间格式进行转换
    这篇文章主要介绍了怎么在Java中利用SimpleDateFormat对英文时间格式进行转换,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!Java可以用来干什么Java主要应用于:1. web开发;2....
    99+
    2023-05-30
    java simpledateformat
  • 怎么在Android中利用广播对usb连接状态进行监听
    今天就跟大家聊聊有关怎么在Android中利用广播对usb连接状态进行监听,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现方法如下:package com.lgs.test.tes...
    99+
    2023-05-31
    android roi usb
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作