Android 屏幕横竖切换详解

Android 屏幕横竖切换

Android 里面控制Activity的方向,只要在AndroidManifest.xml里面对应的Activity节点下加一句

android:screenOrientation="landscape"(landscape是横屏,portrait竖屏)。

我凭这句话混了一年,基本都可以的,但是这几天我发现这招不是万能的了。

项目里面有一个横屏播放视频的PlayAcitivity,我和之前一样设置了android:screenOrientation="landscape"。到这边都没有问题,后来加了一个需求,点击屏幕上面的”评论”按钮,弹出一个对话框,这个对话框我是用Activity实现的。效果是:竖屏、评论界面占据屏幕的中间一块,周围是半透明的。

神奇的事情出现了,评论窗口弹出后,我发现后面的播放界面居然变成了竖屏。(因为上面说过,这个对话框只暂居了大半个屏幕,周围透明,所以可以看见后面的界面PlayAcitivity)。

看见屏幕切换为竖屏了,我就郁闷了,我明明设置了android:screenOrientation="landscape",为什么还切换呢。

后来谷歌、百度…  也没有找出原因来。自我理解是这样的:虽然PlayAcitivity被遮住了,但是依然有一部分可见。而顶部窗口(对话框)是设置为android:screenOrientation="portrait"的,屏幕只有一个,肯定是根据顶部窗口的设置为准。

Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载),怎么使屏幕横竖屏切换时,当前的Activity不销毁呢?

 在AndroidManifest.xml中为Activity设置configChanges属性.

configChanges有如下选项: 

1. orientation :屏幕在纵向和横向间旋转;

2. keyboardHidden:键盘显示或隐藏;

3.fontScale: 用户变更了首选的字体大小

4.locale: 用户选择了不同的语言设定;

5. keyboard: 键盘类型变更,例如手机从12键盘切换到全键盘

6. touchscreen或navigation: 键盘或导航方式变化,

如果缺少了keyboardHidden选项,不能防止Activity的销毁,并且在之后提到的onConfigurationChanged事件中只能捕获竖屏变横屏的事件不能捕获横屏变竖屏。

android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。在AndroidManifest.xml中添加上述代码的含义是表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行onCreate()方法,而是直接执行onConfigurationChanged()。如果不申明此段代码,按照Activity的生命周期,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作。所以如果改变屏幕方向这样的操作都去执行onCreate()方法,就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。这是需要千万避免的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android中利用viewflipper动画切换屏幕效果

    整个项目的 package com.example.viewflipper; import android.R.integer; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.GestureDetector.OnDoubleTapListener; import android.view.Menu; import android.view.Me

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

    本文实例讲述了Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法.分享给大家供大家参考,具体如下: 首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性 <activityandroid:name=".FileBrowser"android:label="@string/app_name"android:

  • 解决Android手机屏幕横竖屏切换

    Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载), 怎么使屏幕横竖屏切换时,当前的Activity不销毁呢? 1. 在AndroidManifest.xml中为Activity设置configChanges属性, application android:icon="@drawable/icon" android:label="@string/app_name"> <activ

  • Android横竖屏幕切换小结

    Android手机或平板都会存在横竖屏切换的功能,通常是由物理重力感应触发的,但是有时候也不尽然,通常在设置里面我们可以对手机的横竖屏切换进行关闭. AndroidManifest.xml <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|

  • Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie

  • Android 屏幕切换监听的实例代码

    昨天,我试着在屏幕切换时,使View显示在不同的位置,在网上搜索了一些资料,自己做了一段时间,终于完成了功能. 由于屏幕切换会调用activity的各个生命周期,所以需要在manifest的activity属性加上代码 android:configChanges="keyboardHidden|orientation|screenSize|locale|layoutDirection" 然后重写onConfigurationChanged(),加上自己的处理代码 @Override p

  • ANDROID中使用VIEWFLIPPER类实现屏幕切换(关于坐标轴的问题已补充更改)

    屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如下动图: 该类有如下几个和动画相关的函数: setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation:一个接受两个参数,类型为Context和int,分别为Context对象和定义An

  • Android 屏幕横竖切换详解

    Android 屏幕横竖切换 Android 里面控制Activity的方向,只要在AndroidManifest.xml里面对应的Activity节点下加一句 android:screenOrientation="landscape"(landscape是横屏,portrait竖屏). 我凭这句话混了一年,基本都可以的,但是这几天我发现这招不是万能的了. 项目里面有一个横屏播放视频的PlayAcitivity,我和之前一样设置了android:screenOrientation=&q

  • Android6.0 屏幕固定功能详解

    可能大家看到这个标题不知道是什么东西,我先说明下,android6.0在设置->安全->屏幕固定开启后,然后再长按home键出现最近的几个Activity可以选择一个图钉按钮就开启了屏幕固定功能. 屏幕固定开启后,屏幕只能固定在设定的Task上的Activity切换. 一.设置固定屏幕 我们先来看SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java的代码,这段代码就是长按home键出现几个Activity,然后按

  • Android 三种动画详解及简单实例

    Android 三种动画详解 帧动画 一张张图片不断的切换,形成动画效果 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="

  • Android显示系统SurfaceFlinger详解

    目录 一.Android系统启动 二.SurfaceFlinger代码剖析[Android 11] 1.[执行文件-surfaceflinger] 2.[动态库-libsurfaceflinger.so] 3. 服务启动配置文件:/frameworks/native/services/surfaceflinger/surfaceflinger.rc 4. Surface 创建过程 ①FramebufferNativeWindow ②应用程序的本地窗口 - Surface ③Surface的创建

  • Android NTP 时间同步机制详解

    目录 正文 初始化 NetworkTimeUpdateCallback AutoTimeSettingObserver MyHandler onPollNetworkTime 总结 正文 NTP是Android原生通过网络获取时间的机制,其中关键代码逻辑都在NetworkTimeUpdateService,它是Android系统服务,由SystemServer启动. 本篇文章基于Android 10源码分析. 初始化 我们从它的构造方法开始分析: public NetworkTimeUpdate

  • Android init.rc文件详解及简单实例

    Android init.rc文件详解 本文主要来自$ANDROID_SOURCE/system/init/readme.txt的翻译. 1 简述 Android init.rc文件由系统第一个启动的init程序解析,此文件由语句组成,主要包含了四种类型的语句:Action,Commands,Services,Options.在init.rc文件中一条语句通常是占据一行.单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符"\",如果在一行的末尾有一个反斜杠,那么

  • Android View.onMeasure方法详解及实例

    Android View.onMeasure方法详解及实例 View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1.什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,"你想要用多大地方啊?",然后传入两个参数--widthMeasureSpec和heightMeasureSpec. 这两个参数指明控件可获得的空间以及关于这个空间描述的元数据. 更好的方法是你传递View的高度和宽度到setMeasuredDi

  • RN在Android打包发布App(详解)

    1-:生成一个签名密钥 你可以用keytool命令生成一个私有密钥.在Windows上keytool命令放在JDK的bin目录中(比如C:\Program Files\Java\jdkx.x.x_x\bin),你可能需要在命令行中先进入那个目录才能执行此命令.在mac上,直接进入项目根目录输入一下命令: $ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2

  • Android view绘制流程详解

    绘制流程 measure 流程测量出 View 的宽高尺寸. layout 流程确定 View 的位置及最终尺寸. draw 流程将 View 绘制在屏幕上. Measure 测量流程 系统是通过 MeasureSpec 测量 View 的,在了解测量过程之前一定要了解这个 MeasureSpec . MeasureSpec MeasureSpec 是一个 32 位的 int 值打包而来的,打包为 MeasureSpec 主要是为了避免过多的对象内存分配. 为了方便操作,MeasureSpec

  • Android SurfaceView基础用法详解

    Android 游戏开发框架核心组件 核心组件介绍 SurfaceView 介绍 SurfaceView 介绍 SurfaceView 就是带 Surface 的 view,它是一个 View,是 View 的子类,所以和其他 View 一样,可以在屏幕上展示东西接收用户输入,具有 View 的生命周期回调函数,如 onMeasure.onLayout.onDraw.onTouchEvent 等 SurfaceView 带有独立的 Surface(独立与 window 的 surface),这可

随机推荐