安卓基础之《(25)—竖屏与横屏切换》

一、竖屏与横屏

1、手机有竖屏与横屏两种模式,两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之际,甚至会打乱App的生命周期

2、日志

竖屏:

bash 复制代码
2026-04-09 13:37:59.756  9363-9363  sam                     com.example.chapter09                D  onCreate
2026-04-09 13:37:59.960  9363-9363  sam                     com.example.chapter09                D  onStart
2026-04-09 13:38:00.092  9363-9363  sam                     com.example.chapter09                D  onResume

切换到横屏:

bash 复制代码
2026-04-09 13:38:10.225  9363-9363  sam                     com.example.chapter09                D  onPause
2026-04-09 13:38:10.228  9363-9363  sam                     com.example.chapter09                D  onStop
2026-04-09 13:38:10.234  9363-9363  sam                     com.example.chapter09                D  onDestroy
2026-04-09 13:38:10.582  9363-9363  sam                     com.example.chapter09                D  onCreate
2026-04-09 13:38:10.594  9363-9363  sam                     com.example.chapter09                D  onStart
2026-04-09 13:38:10.597  9363-9363  sam                     com.example.chapter09                D  onResume

原来的activity是销毁了,切换到横屏后又创建了一个activity

二、系统配置变更的处理机制

1、为了用同一个activity去切换,避免横竖屏切换时重新加载界面的情况,android设计了一种配置变更机制,在指定的环境配置发生变更之时,无需重启活动页面,只需执行特定的变更行为

2、实现步骤

(1)修改AndroidManifest.xml,给activity节点增加android:configChanges属性

(2)修改活动页面的Java代码,重写活动页面onConfigurationChanged方法,补充对应的代码处理逻辑

3、配置变更的豁免情况

|--------------------|-------------------------|
| configChanges属性的取值 | 说明 |
| orientation | 屏幕方向发生改变 |
| screenLayout | 屏幕的显示发生改变,例如在全屏和分屏之间切换 |
| screenSize | 屏幕大小发生改变,例如在竖屏与横屏之间切换 |
| keyboard | 键盘发生改变,例如使用了外部键盘 |
| keyboardHidden | 软键盘弹出或隐藏 |
| navigation | 导航方式发生改变,例如采用了轨迹球导航 |
| fontScale | 字体比例发生改变,例如在系统设置中调整默认字体 |
| locale | 设备的本地位置发生改变,例如切换了系统语言 |
| uiMode | 用户界面的模式发生改变,例如开启了夜间模式 |

4、例子

ChangeDirectionActivity.java

java 复制代码
package com.example.chapter09;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.TextView;

public class ChangeDirectionActivity extends AppCompatActivity {

    private TextView tv_monitor;

    @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(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        switch (newConfig.orientation) {
            case Configuration.ORIENTATION_PORTRAIT:
                tv_monitor.setText("当前屏幕为竖屏方向");
                break;
            case Configuration.ORIENTATION_LANDSCAPE:
                tv_monitor.setText("当前屏幕为横屏方向");
                break;
            default:
                break;
        }
    }
}

布局文件,activity_change_direction.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ChangeDirectionActivity">

    <TextView
        android:id="@+id/tv_monitor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请旋转手机使屏幕在竖屏和横屏之间切换"
        android:textColor="@color/black"
        android:textSize="17sp"/>
</LinearLayout>

AndroidManifest.xml清单文件修改

XML 复制代码
        <activity
            android:name=".ChangeDirectionActivity"
            android:exported="true"
            android:configChanges="orientation|screenLayout|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

5、限定屏幕方向

android:screenOrientation="portrait"

相关推荐
古法安卓3 小时前
Android-休眠唤醒后onLocationChanged没有数据问题排查
android·java·android studio
Htr_6 小时前
Creem 2.0 使用指南:面向 AI 构建时代的资金平台
android·数据库·人工智能·ui·photoshop
wardenlzr7 小时前
车机看门狗(Watchdog)为何会让整机硬重启
android·优化·车机
IT毕设实战小研7 小时前
基于大数据的商场商铺数据分析与可视化的设计与实现
android·java·大数据·django·课程设计
aqi008 小时前
一文读懂 HarmonyOS 7.0 带来的十大API重要升级
android·华为·harmonyos·鸿蒙·harmony
是店小二呀9 小时前
鸿蒙PC开源移植:CodeLite原生IDE与Remote Agent适配
android·智能手机·远程桌面
终端安全笔记10 小时前
iOS 27 给了租赁一个新工具,但它只认受监督的设备
android·网络·安全·ios
爱笑鱼10 小时前
Android 系统启动机制(八):系统服务怎样从创建走到可用?SystemServiceManager 和 Boot Phase 各管什么?
android
hai_android10 小时前
Android 组件化开发实践
android·java·kotlin