You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何让WebView支持横屏显示?(Java实现)

解决Android WebView横屏显示异常的问题

我来帮你捋捋这个WebView横屏的问题,看了你的代码后,发现几个关键环节没处理到位,咱们一步步来修复:

问题根源分析

  1. onConfigurationChanged未被触发:Android默认在横竖屏切换时会销毁并重建Activity,你的重写方法根本没机会执行,必须在Manifest里配置相关参数才能让系统回调这个方法。
  2. 不必要的页面重加载:每次横竖屏都调用loadUrl不仅浪费资源,还会丢失页面状态,这也不是横屏异常的核心原因。
  3. WebView状态未保存:横竖屏切换时如果Activity重建,WebView的页面状态会丢失,导致显示异常。

分步解决方案

第一步:修改Manifest配置

打开AndroidManifest.xml,给你的MainActivity添加android:configChanges属性,让系统跳过Activity重建,直接回调onConfigurationChanged:

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|smallestScreenSize|keyboardHidden">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

注:screenSize是API 13之后必须添加的参数,否则横竖屏切换依然会触发Activity重建。

第二步:优化Activity代码

调整代码逻辑,保存WebView状态、让WebView自适应屏幕,去掉不必要的页面重加载:

import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.res.Configuration;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private WebView mainWebView; // 改成成员变量,避免重复查找View

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainWebView = findViewById(R.id.MainWebView);
        WebSettings webSettings = mainWebView.getSettings();
        
        // 基础配置
        webSettings.setJavaScriptEnabled(true);
        // 核心:让WebView自适应屏幕宽度
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        // 可选:启用缩放支持
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        
        // 恢复WebView状态(避免横竖屏切换丢失页面进度)
        if (savedInstanceState != null) {
            mainWebView.restoreState(savedInstanceState);
        } else {
            mainWebView.loadUrl("https://example.com");
        }
    }

    // 保存WebView状态,用于横竖屏切换后恢复
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mainWebView.saveState(outState);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        
        // 仅做状态提示,无需重新加载页面
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(getApplicationContext(), "已切换到横屏模式", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(getApplicationContext(), "已切换到竖屏模式", Toast.LENGTH_SHORT).show();
        }
        
        // 强制WebView重新测量布局,解决部分显示错位问题
        mainWebView.requestLayout();
    }
}

第三步:检查布局文件

确保activity_main.xml中的WebView使用了自适应布局参数,避免固定宽高导致横屏显示不全:

<WebView
    android:id="@+id/MainWebView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

额外优化(针对网页本身的适配)

如果网页没有做移动端适配,可通过WebSettings强制调整:

// API 19后已废弃,但部分旧版本仍生效
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

更推荐的方式是让网页添加viewport元标签(如果有权限修改网页的话):

<meta name="viewport" content="width=device-width, initial-scale=1.0">

总结

核心思路是:让Activity在横竖屏切换时不重建,保存WebView的页面状态,同时通过WebSettings让WebView自适应屏幕宽度,避免不必要的页面重加载。按照上面的步骤调整后,WebView应该就能正常适配横屏模式了。

内容的提问来源于stack exchange,提问作者Elyas Rahimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 14:37:34