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

相关推荐
野生的码农1 分钟前
能工智人,40 大寿,尚能班否?
android·ai编程
事圆则缓6 分钟前
Android 串口通信:从 /dev/ttyS1到协议帧
android
java1234_小锋14 分钟前
【技术专题】CSS3 网页技术 - CSS3 基础样式
android·前端·css3
tongyiixiaohuang10 小时前
WMS已发货状态反写金蝶云星空:单策略实战教程
android
好的佩奇11 小时前
Dart 之类修饰符
android·flutter·dart
alexhilton12 小时前
用Konsist与Lint强制执行设计系统契约
android·kotlin·android jetpack
北京自在科技16 小时前
谷歌安卓 Gemini 迎来界面改版,Find Hub 接入 Gemini 支持物品记忆查找
android·安卓
YB137518 小时前
Jetpack Compose 动画Modifier.animateItem()
android
2401_8858850419 小时前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
收纳过往19 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava