安卓基础之《(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 隐藏桌面应用,指定应用显示;暗码输入显示所有应用,以及暗码方式触发
android
csj504 小时前
安卓基础之《(26)—回到桌面与切到任务列表》
android
Grackers4 小时前
Android Perfetto 系列 7:MainThread 和 RenderThread 解读
android
whatever who cares4 小时前
java/android中单例模式详解
android·java
草莓熊Lotso4 小时前
【Linux系统加餐】 mmap 文件映射全解:从底层原理、API 到实战开发(含 malloc 模拟实现)
android·linux·运维·服务器·c语言·c++
peakmain94 小时前
CmComposeUI——基于 Kotlin Multiplatform Compose 的 UI 组件库
android
LcGero4 小时前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb
fundoit4 小时前
MySQL插入数据遇到唯一键已存在怎么办?
android·数据库·mysql
ameyume4 小时前
基于原生Android 16设置音量调用流程
android·audio