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

相关推荐
赏金术士18 小时前
Jetpack Compose 状态提升(State Hoisting)完全指南
android·kotlin·compose
BoomHe18 小时前
git Rebase 为任意一笔提交补上 Change-Id
android·git·android studio
TDengine (老段)19 小时前
TDengine 超级表/子表/普通表 — 设计理念与内部表示
android·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
shuaiqinke19 小时前
【分享】Edge浏览器|内置扩展仓库|支持油猴|上网无限制
android·前端·人工智能·edge
Carson带你学Android20 小时前
见证历史!Swift 6.3 官方支持 Android,跨平台要变天了?
android
plainGeekDev21 小时前
Android性能优化面试题:你说你会优化,结果连ANR都排查不了
android·面试
richard_yuu21 小时前
鸿蒙本地数据存储实战|Preferences 封装、数据隔离与隐私合规存储方案
android·华为·harmonyos
木易 士心21 小时前
深入理解 OKHttp:设计模式、核心机制与架构优势
android·设计模式·架构
Ehtan_Zheng21 小时前
Jetpack Compose `@ReadOnlyComposable` 的“魔法”
android
沐言人生1 天前
ReactNative 源码分析11——Native View创建流程setChildren和manageChildren
android·react native