Android 《屏幕切换》
默认处理机制
除了系统广播之外,App所处的环境也会影响运行,比如手机有竖屏与横屏两种模式,竖屏时水平方向较短而垂直方向较长,横屏时水平方向较长而垂直方向较短。两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之际,甚至会打乱App的生命周期。
无需重启Activity
横竖屏切换,Activity的生命周期会重新走一遍,为了避免横竖屏切换时重新加载界面的情况,Android设计了一种配置变更机制,在指定的环境配置发生变更之时,无须重启活动页面,只需执行特定的变更行为。该机制的编码过程分为两步:
1 .修改AndroidManifest.xml
首先创建新的活动页面ChangeDirectionActivity,再打开AndroidManifest.xml,看到该活动对应的节点配置是下面这样的:
<activity android:name=".ChangeDirectionActivity" />
给这个activity节点增加android:configChanges属性,并将属性值设“orientation|screenLayout|screenSize”,修改后的节点配置如下所示:
<activity android:name=".ChangeDirectionActivity" android:configChanges="orientation|screenLayout|screenSize" />
新属性configChanges的意思是,在某些情况之下,配置项变更不用重启活动页面,只需调用onConfigurationChanged方法重新设定显示方式。故而只要给该属性指定若干豁免情况,就能避免无谓的页面重启操作了,配置变更豁免情况的取值说明见表
2 .修改活动页面的Java代码
打开ChangeDirectionActivity的Java代码,重写活动的onConfigurationChanged方法,该方法的输入参数为Configuration类型的配置对象,根据配置对象的orientation属性,即可判断屏幕的当前方向是竖屏还是横屏,再补充对应的代码处理逻辑。下面是重写了onConfigurationChanged方法的活动代码例子:
public class ChangeDirectionActivity extends AppCompatActivity { private TextView tv_monitor; // 声明一个文本视图对象 private String mDesc = ""; // 屏幕变更的述说明 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_change_direction); tv_monitor = findViewById(R.id.tv_monitor); } // 在配置项变更时触发。比如屏幕方向发生变更等等 // 有的手机需要在系统的“设置→显示”菜单开启“自动旋转屏幕”,或者从顶部下拉,找到“自动旋转”图标并开启 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); switch (newConfig.orientation) { // 判断当前的屏幕方向 case Configuration.ORIENTATION_PORTRAIT: // 切换到竖屏 mDesc = String.format("%s%s %s\n", mDesc, DateUtil.getNowTime(), "当前屏幕为竖屏方向"); tv_monitor.setText(mDesc); break; case Configuration.ORIENTATION_LANDSCAPE: // 切换到横屏 mDesc = String.format("%s%s %s\n", mDesc, DateUtil.getNowTime(), "当前屏幕为横屏方向"); tv_monitor.setText(mDesc); break; default: break; } } }
3.只保持竖屏
如果希望App始终保持竖屏界面,即使手机旋转为横屏也不改变App的界面方向,可以修改 AndroidManifest.xml,给activity节点添加android:screenOrientation属性,并将该属性设置为portrait表示垂直方向,也就是保持竖屏界面;若该属性为landscape则表示水平方向,也就是保持横屏界面。修改后的activity节点示例如下:
<activity android:name=".ActTestActivity" android:screenOrientation="portrait"/>
landscape 为横屏
本文来自博客园,作者:一个小笨蛋,转载请注明原文链接:https://www.cnblogs.com/paylove/p/18066066
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!