Android 手动切换横竖屏及 onConfigurationChanged

在 Android 开发中,我们经常会遇到需要在横竖屏之间切换的情况。默认情况下,当用户旋转设备时,Android 系统会销毁当前活动并重新创建,这可能会导致数据丢失和用户体验的不连续性。为了解决这个问题,我们可以手动控制横竖屏的切换,并在切换时保持当前活动的状态。本文将详细介绍如何手动切换横竖屏以及如何处理横竖屏切换时的事件。

手动切换横竖屏

首先,我们需要在 AndroidManifest.xml 文件中设置当前活动的屏幕方向为横向或纵向。在 <activity> 标签中添加 android:screenOrientation 属性,值为 portrait(纵向)或 landscape(横向)。

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait">

然后,在需要手动切换横竖屏的地方,我们可以通过调用 setRequestedOrientation() 方法来实现。该方法接受一个参数,用于指定要切换到的屏幕方向。以下是一个示例:

// 切换到横向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

// 切换到纵向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

onConfigurationChanged 事件

当屏幕方向发生改变时,Android 系统会触发 onConfigurationChanged() 方法,我们可以重写该方法来处理屏幕方向改变时的逻辑。首先,在活动中添加以下代码:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // 处理屏幕方向改变的逻辑
}

onConfigurationChanged() 方法中,我们可以根据 newConfig 的值来判断屏幕方向。以下是一个示例:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // 横向
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        // 纵向
    }
}

在处理完屏幕方向改变的逻辑后,我们可能需要更新界面以适应新的屏幕方向。这时,我们可以调用 setContentView() 方法重新加载布局文件。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.activity_main_landscape);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        setContentView(R.layout.activity_main_portrait);
    }
}

序列图

下面是一个使用序列图来展示手动切换横竖屏及处理 onConfigurationChanged 事件的示例。

sequenceDiagram
    participant User
    participant Activity
    participant System

    User->>+Activity: 切换横竖屏
    Activity-->>-User: 切换屏幕方向
    Activity->>System: 设置屏幕方向
    System->>Activity: onConfigurationChanged 事件
    Activity-->>-System: 处理逻辑
    System->>+Activity: 加载布局文件
    Activity-->>-System: 更新界面

结论

通过手动控制横竖屏的切换,我们可以避免系统重新创建活动并保持当前活动的状态。同时,通过处理 onConfigurationChanged 事件,我们可以在屏幕方向改变时,根据需要更新界面。希望本文对你理解 Android 手动切换横竖屏及 onConfigurationChanged 有所帮助。

注意:以上代码仅为示例,具体实现可能因项目而异。请根据你的实际需求进行相应的修改。

参考资料:

  • [Android Developers: Handling Runtime Changes](