安卓基础之《(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"

相关推荐
成都大菠萝13 小时前
Android Car CarProperty 车辆信号链路
android
敲代码的鱼13 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹15 小时前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
Coffeeee19 小时前
闲聊几句,Android老哥们,你们多久没做技改需求了
android·程序员·代码规范
萝卜er20 小时前
Fragment 生命周期与状态恢复-《Android深水区(四)》
android
萝卜er20 小时前
Intent 显式、隐式与 PendingIntent-《Android深水区(五)》
android
Kapaseker1 天前
一文吃透 Kotlin 集合操作符
android·kotlin
三少爷的鞋1 天前
Main-safe:现代Android 架构真正的分水岭
android
沐怡旸1 天前
深入解析 Android Performance Analyzer (APA) 底层架构与技术原理
android
李斯维2 天前
从历史的角度看 Android 软件架构
android·架构·android jetpack