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

Android Studio实现WebView无法显示导航菜单及背景logo问题问询

问题背景

我尝试使用Android Studio和Java为我的站点实现WebView加载功能,相关代码如下:

  • MainActivity.java
package com.example.neurofinance;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.TargetApi;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MainActivity extends AppCompatActivity {


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getWindow().getDecorView().setSystemUiVisibility(

                View.SYSTEM_UI_FLAG_LAYOUT_STABLE

                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

                        | View.SYSTEM_UI_FLAG_FULLSCREEN);



        WebView webView = findViewById(R.id.webView);
        //WebSettings webSettings = webView.getSettings();
        webView.getSettings().setDomStorageEnabled(true);

        webView.getSettings().setJavaScriptEnabled(true);
//        webSettings.setJavaScriptEnabled(true);
//        webSettings.setDomStorageEnabled(true);

        webView.getSettings().setUseWideViewPort(true);//setting wide view
        webView.getSettings().setLoadWithOverviewMode(true);//setting default zoomed out view
        webView.setInitialScale(1);
        webView.getSettings().setBuiltInZoomControls(true);//setting zoom controls

        webView.loadUrl("www.URL.com");
        

        WebViewClient webViewClient = new WebViewClient() {

            @SuppressWarnings("deprecation") @Override

            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                view.loadUrl(url);

                return true;

            }

            @Override
            public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();
            }

            @TargetApi(Build.VERSION_CODES.N) @Override

            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

                view.loadUrl(request.getUrl().toString());

                return true;

            }

        };

        webView.setWebViewClient(webViewClient);


    }
}
  • AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.neurofinance">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize">>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

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

</androidx.constraintlayout.widget.ConstraintLayout>
问题描述

当前我的WebView无法正常显示导航菜单(三点图标)和横幅背景,效果对比图如下,左侧为WebView加载效果,右侧为站点本身的正常展示效果:
效果对比图
我尝试添加了如下配置但未解决问题:

webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);

请问还有什么可行的解决办法?


解决方案

按优先级依次尝试以下操作即可:

  1. 补充WebSettings缺失配置
    默认WebView对现代前端特性的支持有限,在现有配置基础上添加如下代码:
WebSettings webSettings = webView.getSettings();
// 兼容混合内容加载,解决https站点加载http资源失败的问题
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
// 开启数据库存储,适配部分前端框架的存储依赖
webSettings.setDatabaseEnabled(true);
// 允许JS自动打开窗口,适配弹窗类导航菜单的逻辑
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// 对齐移动端浏览器的UserAgent,避免站点返回不兼容的桌面端样式
webSettings.setUserAgentString(webSettings.getUserAgentString().replace("; wv", ""));
// 隐藏缩放控件,避免遮挡导航栏元素
webSettings.setDisplayZoomControls(false);
  1. 修复全屏适配问题
    你当前开启了沉浸全屏模式,站点顶部元素可能被系统状态栏遮挡,可以给WebView添加顶部适配:
// 获取状态栏高度
int statusBarId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (statusBarId > 0) {
    int statusBarHeight = getResources().getDimensionPixelSize(statusBarId);
    webView.setPadding(0, statusBarHeight, 0, 0);
}
  1. 修正加载地址格式
    你当前的加载地址没有带http/https协议头,会导致WebView无法正常识别资源路径,改为完整地址即可:
webView.loadUrl("https://www.URL.com"); // 替换为你的实际站点地址
  1. 修复Manifest配置错误
    你的AndroidManifest里Activity标签多了一个多余的闭合尖括号,删除即可避免配置异常:
<!-- 修改前 -->
<activity android:name=".MainActivity"
    android:configChanges="orientation|keyboardHidden|screenSize">>

<!-- 修改后 -->
<activity android:name=".MainActivity"
    android:configChanges="orientation|keyboardHidden|screenSize">

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:21:00