Android WebView去掉Header

H5页面Header隐藏技巧
本文分享了在H5页面中使用JavaScript隐藏Header的具体方法,包括WebView设置与自定义JavaScript函数,适用于移动应用中嵌入网页场景。

问题:

由于我们这,h5页面是外包弄的,获取的html没有设置成手机端的html页面。js代码

结果就是将js当中的header 隐藏掉

现在贴当中的代码:xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/layout_titlebar" />

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

</LinearLayout>

activity:

@Route(path = "/web/WebHideHeaderActivity")
public class WebHideHeaderActivity extends BaseActivity {
    @BindView(R.id.ll_back)
    LinearLayout mLlBack;
    @BindView(R.id.tv_title)
    TextView mTvTitle;
    @BindView(R.id.web_hide_head)
    WebView mWebHideHead;
    private Dialog mDialog;
    private String  mUrl;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_hide_header);
        ButterKnife.bind(this);
        initView();
    }

    private void initView() {
        mTvTitle.setText(R.string.details);
        mLlBack.setVisibility(View.VISIBLE);
        mDialog = DialogUtils.setDialog(WebHideHeaderActivity.this);
        mUrl = getIntent().getStringExtra(ConstantUtil.WEB_VIEW_URL);
        WebSettings webSettings = mWebHideHead.getSettings();
        // 如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
        webSettings.setJavaScriptEnabled(true);
        //支持插件
//        webSettings.setPluginsEnabled(true);
        // 设置自适应屏幕,两者合用
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
        // 缩放操作
        webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
        // 其他细节操作
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
        webSettings.setAllowFileAccess(true); //设置可以访问文件
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式


        mWebHideHead.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return false;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {

            }

            @Override
            public void onPageFinished(WebView view, String url) {
//                myWvDetails.loadUrl("javascript:document.getElementsByTagName('header')[0].style.display='none';");
                String javascript = "javascript:function hideOther() {" +
                        "var headers = document.getElementsByTagName('header');" +
                        "var lastHeader = headers[headers.length-1];" +
                        "lastHeader.remove();" +
                        "var divs = document.getElementsByTagName('nav');" +
                        "var lastDiv = divs[divs.length-1];" +
                        "lastDiv.remove();" +
                        "}";

                //创建方法
                view.loadUrl(javascript);

                //加载方法
                view.loadUrl("javascript:hideOther();");
                mDialog.dismiss();
                super.onPageFinished(view, url);
            }

            @Override
            public void onLoadResource(WebView view, String url) {

            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                Log.d("errro", errorCode + "---" + description + " --- " + failingUrl);
            }

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

        mWebHideHead.loadUrl(mUrl);
    }

    @OnClick(R.id.ll_back)
    public void onViewClicked() {
        finish();
    }

我在我的项目当中去实现这段代码的时候出现,隐藏失败的问题。 由于我自定义WebView,以及布局嵌套的问题等等,造成在我的项目当中实现不了  隐藏的功能。然后我就用排除方法,我就重新单独创建新的一个界面,这样就成功啦!这样,隐藏Header就成功啦!

 

 

package com.example.layoutdome; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.MediaController; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelector; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity3 extends AppCompatActivity implements StyleRequest.OnStyleRequestListener { private WebView webView, topWebView; private TextView tvMarqueeBlue,tvMarqueeGreen,tvMarqueePurple; private FullScreenVideoView videoView; private String url; private String topUrl; private String lastValue = "";//避免必要的页面加载 private ImageView ivImage; private RelativeLayout rlBlue, rlGreen, rlPurple; private Handler handler = new Handler(Looper.getMainLooper()); private Runnable refreshRunnable = new Runnable() { @Override public void run() { // 执行请求 new StyleRequest(MainActivity3.this).execute(); // 每 5 分钟重复执行 handler.postDelayed(this, 10000); } }; public static int getDeviceWidthInDp(Context context) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int widthPixels = displayMetrics.widthPixels; float density = displayMetrics.density; return (int) (widthPixels / density); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); webView = findViewById(R.id.web); topWebView = findViewById(R.id.webView); ivImage = findViewById(R.id.iv_image_blue); tvMarqueeBlue = findViewById(R.id.tv_marquee_blue); tvMarqueeGreen = findViewById(R.id.tv_marquee_green); tvMarqueePurple = findViewById(R.id.tv_marquee_purple); videoView = (FullScreenVideoView) findViewById(R.id.video); // 初始化三个 RelativeLayout rlBlue = findViewById(R.id.rl_blue); rlGreen = findViewById(R.id.rl_green); rlPurple = findViewById(R.id.rl_purple); // 默认隐藏所有布局 rlBlue.setVisibility(View.GONE); rlGreen.setVisibility(View.GONE); rlPurple.setVisibility(View.GONE); // 从 Intent 获取预加载的 URL Intent intent = getIntent(); String topUrl = intent.getStringExtra("topUrl"); String mainUrl = intent.getStringExtra("mainUrl"); if (topUrl !=null && mainUrl != null) { SetUpTopTheWebPageWithUrl(topUrl); SetUpTheWebPageWithUrl(mainUrl); }else { // 如果没有预加载数据,则走原来的逻辑 // 1. 立即执行一次请求 new StyleRequest(this).execute(); // 启动定时任务:每 5 分钟执行一次 handler.postDelayed(refreshRunnable, 10000); // 5 分钟 } SetUpTheVideo(); int widthDp = getDeviceWidthInDp(this); Log.d("ScreenInfo", "Device width in dp: " + widthDp); initTopWebViewClient(); // 只设置一次 } private void initTopWebViewClient() { topWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d("WebView", "开始加载: " + url); } @Override public void onPageFinished(WebView view, String url) { Log.d("WebView", "页面加载完成: " + url); view.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { Log.e("WebView", "加载错误: " + error.toString()); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("WebView", "尝试加载: " + url); view.loadUrl(url); return true; } }); } @Override public void onStyleRequest(StyleList styleList) { String value = styleList.getData().getValue(); if (value != null && !value.equals(lastValue)) { lastValue = value; // 更新 lastValue SetUpTheWebPage(value); SetUpTopTheWebPage(value); // 切换布局显示 showBulletinByValue(value); Log.d("MainActivity3", "valuewqeqweqweqweq" + value); } else { Log.d("MainActivity3", "value 未发生变化,跳过加载"); } } // 根据 value 切换显示哪个布局 @SuppressLint("ResourceAsColor") public void showBulletinByValue(String value) { // 先隐藏所有 rlBlue.setVisibility(View.GONE); rlGreen.setVisibility(View.GONE); rlPurple.setVisibility(View.GONE); // 根据 value 显示对应的布局 switch (value) { case "1": rlGreen.setVisibility(View.VISIBLE); SetUpMarquees(tvMarqueeGreen); tvMarqueeGreen.setTextColor(getColor(R.color.green)); break; case "2": SetUpMarquees(tvMarqueePurple); tvMarqueePurple.setTextColor(getColor(R.color.purple)); rlPurple.setVisibility(View.VISIBLE); break; default: SetUpMarquees(tvMarqueeBlue); tvMarqueeBlue.setTextColor(getColor(R.color.white)); rlBlue.setVisibility(View.VISIBLE); // 默认显示蓝色 break; } } @SuppressLint("SetJavaScriptEnabled") private void SetUpTopTheWebPage(String value) { if (topWebView == null) { Log.e("SetUpTopTheWebPage", "topWebView 未初始化"); return; } WebSettings webSettings = topWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); switch (value) { case "0": // 加载网页 topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=0"; break; case "1": topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=1"; break; case "2": topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=2"; break; } // 清除缓存 topWebView.clearCache(true); topWebView.clearHistory(); Log.i("wangye", "dizhi" + topUrl); // 添加时间戳防止缓存 String finalUrl = topUrl + "&t=" + System.currentTimeMillis(); // 预加载顶部 WebView topWebView.loadUrl("about:blank"); // 先加载空白页 // 然后再加载真实 URL new Handler(Looper.getMainLooper()).postDelayed(() -> { topWebView.loadUrl(finalUrl); }, 50); } private void SetUpMarquees(TextView textView) { textView.setText("S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整"); textView.setSelected(true); // 必须设置为 selected 才能启动 marquee textView.setFocusable(true); textView.setFocusableInTouchMode(true); textView.requestFocus(); // 强制获取焦点 } private void SetUpTheVideo() { // 视频文件的路径 String videoPath = "/storage/emulated/0/Download/DEFAULT.mp4"; // 创建 File 对象 File videoFile = new File(videoPath); // 检查文件是否存在 if (videoFile.exists()) { // 文件存在 Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show(); } else { // 文件存在 Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show(); } // 设置视频路径 videoView.setVideoPath(videoPath); // 添加控制器 MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // 播放视频 videoView.start(); } }); // 检查文件格式和编码是否受支持 videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (what == MediaPlayer.MEDIA_ERROR_UNSUPPORTED) { } // 处理支持的文件格式或编码 Log.e("VideoPlayer", "播放视频时发生错误. what: " + what + ", extra: " + extra); return false; } }); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTheWebPage(String value) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); // 注入接口对象 webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); Log.d("MainActivity3", "value 发生变化,加载"); Log.i("MainActivity3", "下边距web:" + value); switch (value) { case "0": // 加载网页 url = "http://192.168.2.36:8088/#/electrStation?deviceNo=ES02"; break; case "1": url = "http://192.168.2.36:8088/#/electrStation/greenTemp?deviceNo=ES02"; break; case "2": url = "http://192.168.2.36:8088/#/electrStation/purpleTemp?deviceNo=ES02"; break; } // 设置 WebViewClient 以在应用内打开页面 webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); webView.loadUrl(url); } public class JavascriptBroadcastInterfaces { private String lastBroadcast; // 保存上一次收到的 broadcast @JavascriptInterface public void getBroadcast(String broadcast) { Log.i("Broadcast", "Received broadcast: " + broadcast); // 如果新值和上次相同,直接返回 if (broadcast != null && broadcast.equals(lastBroadcast)) { Log.i("Broadcast", "重复的 broadcast,跳过播放"); return; } // 更新 lastBroadcast 为新的值 lastBroadcast = broadcast; // 构造音频 URL String audioUrl = "http://192.168.3.150:816/mp3?s=" + broadcast; if (isUrlReachable(audioUrl, MainActivity3.this)) { // 开始播放音频 Log.e("Broadcast", "音频 URL :" + audioUrl); playAudioWithExoPlayer(audioUrl); } else { Log.e("Broadcast", "音频 URL 可用"); } } SimpleExoPlayer player; private void playAudioWithExoPlayer(String audioUrl) { if (player != null) { player.release(); player = null; } TrackSelector trackSelector = new DefaultTrackSelector(); player = new SimpleExoPlayer.Builder(MainActivity3.this).setTrackSelector(trackSelector).build(); MediaItem mediaItem = MediaItem.fromUri(audioUrl); player.setMediaItem(mediaItem); player.prepare(); player.play(); } } @Override public void onBackPressed() { // 如果 WebView 可以返回,则返回上一页 if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } private boolean isUrlReachable(String audioUrl, Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo == null || !netInfo.isConnected()) { Log.e("Network", "No network connection"); return false; } try { URL url = new URL(audioUrl); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); urlConn.setConnectTimeout(3000); urlConn.setRequestMethod("HEAD"); int responseCode = urlConn.getResponseCode(); String contentType = urlConn.getContentType(); Log.d("URLCheck", "Response Code: " + responseCode); Log.d("URLCheck", "Content-Type: " + contentType); urlConn.disconnect(); return responseCode == HttpURLConnection.HTTP_OK; } catch (IOException e) { Log.e("URLCheck", "URL 可达", e); return false; } } @Override protected void onDestroy() { super.onDestroy(); // 停止定时任务 handler.removeCallbacks(refreshRunnable); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTopTheWebPageWithUrl(String topUrl) { WebSettings webSettings = topWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); topWebView.clearCache(true); topWebView.clearHistory(); String finalUrl = topUrl + "&t=" + System.currentTimeMillis(); topWebView.loadUrl("about:blank"); new Handler(Looper.getMainLooper()).postDelayed(() -> topWebView.loadUrl(finalUrl), 50); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTheWebPageWithUrl(String mainUrl) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); String finalUrl = mainUrl + "&t=" + System.currentTimeMillis(); webView.loadUrl("about:blank"); new Handler(Looper.getMainLooper()).postDelayed(() -> webView.loadUrl(finalUrl), 50); } }这段代码加package com.example.layoutdome; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.MediaController; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelector; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity3 extends AppCompatActivity implements StyleRequest.OnStyleRequestListener { private WebView webView, topWebView; private TextView tvMarqueeBlue,tvMarqueeGreen,tvMarqueePurple; private FullScreenVideoView videoView; private String url; private String topUrl; private String lastValue = "";//避免必要的页面加载 private ImageView ivImage; private RelativeLayout rlBlue, rlGreen, rlPurple; private Handler handler = new Handler(Looper.getMainLooper()); private Runnable refreshRunnable = new Runnable() { @Override public void run() { // 执行请求 new StyleRequest(MainActivity3.this).execute(); // 每 5 分钟重复执行 handler.postDelayed(this, 10000); } }; public static int getDeviceWidthInDp(Context context) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int widthPixels = displayMetrics.widthPixels; float density = displayMetrics.density; return (int) (widthPixels / density); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); webView = findViewById(R.id.web); topWebView = findViewById(R.id.webView); ivImage = findViewById(R.id.iv_image_blue); tvMarqueeBlue = findViewById(R.id.tv_marquee_blue); tvMarqueeGreen = findViewById(R.id.tv_marquee_green); tvMarqueePurple = findViewById(R.id.tv_marquee_purple); videoView = (FullScreenVideoView) findViewById(R.id.video); // 初始化三个 RelativeLayout rlBlue = findViewById(R.id.rl_blue); rlGreen = findViewById(R.id.rl_green); rlPurple = findViewById(R.id.rl_purple); // 默认隐藏所有布局 rlBlue.setVisibility(View.GONE); rlGreen.setVisibility(View.GONE); rlPurple.setVisibility(View.GONE); // 从 Intent 获取预加载的 URL Intent intent = getIntent(); String topUrl = intent.getStringExtra("topUrl"); String mainUrl = intent.getStringExtra("mainUrl"); if (topUrl !=null && mainUrl != null) { SetUpTopTheWebPageWithUrl(topUrl); SetUpTheWebPageWithUrl(mainUrl); }else { // 如果没有预加载数据,则走原来的逻辑 // 1. 立即执行一次请求 new StyleRequest(this).execute(); // 启动定时任务:每 5 分钟执行一次 handler.postDelayed(refreshRunnable, 10000); // 5 分钟 } SetUpTheVideo(); int widthDp = getDeviceWidthInDp(this); Log.d("ScreenInfo", "Device width in dp: " + widthDp); initTopWebViewClient(); // 只设置一次 } private void initTopWebViewClient() { topWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d("WebView", "开始加载: " + url); } @Override public void onPageFinished(WebView view, String url) { Log.d("WebView", "页面加载完成: " + url); view.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { Log.e("WebView", "加载错误: " + error.toString()); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("WebView", "尝试加载: " + url); view.loadUrl(url); return true; } }); } @Override public void onStyleRequest(StyleList styleList) { String value = styleList.getData().getValue(); if (value != null && !value.equals(lastValue)) { lastValue = value; // 更新 lastValue SetUpTheWebPage(value); SetUpTopTheWebPage(value); // 切换布局显示 showBulletinByValue(value); Log.d("MainActivity3", "valuewqeqweqweqweq" + value); } else { Log.d("MainActivity3", "value 未发生变化,跳过加载"); } } // 根据 value 切换显示哪个布局 @SuppressLint("ResourceAsColor") public void showBulletinByValue(String value) { // 先隐藏所有 rlBlue.setVisibility(View.GONE); rlGreen.setVisibility(View.GONE); rlPurple.setVisibility(View.GONE); // 根据 value 显示对应的布局 switch (value) { case "1": rlGreen.setVisibility(View.VISIBLE); SetUpMarquees(tvMarqueeGreen); tvMarqueeGreen.setTextColor(getColor(R.color.green)); break; case "2": SetUpMarquees(tvMarqueePurple); tvMarqueePurple.setTextColor(getColor(R.color.purple)); rlPurple.setVisibility(View.VISIBLE); break; default: SetUpMarquees(tvMarqueeBlue); tvMarqueeBlue.setTextColor(getColor(R.color.white)); rlBlue.setVisibility(View.VISIBLE); // 默认显示蓝色 break; } } @SuppressLint("SetJavaScriptEnabled") private void SetUpTopTheWebPage(String value) { if (topWebView == null) { Log.e("SetUpTopTheWebPage", "topWebView 未初始化"); return; } WebSettings webSettings = topWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); switch (value) { case "0": // 加载网页 topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=0"; break; case "1": topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=1"; break; case "2": topUrl = "http://192.168.2.36:8088/#/header?deviceNo=ES02&type=2"; break; } // 清除缓存 topWebView.clearCache(true); topWebView.clearHistory(); Log.i("wangye", "dizhi" + topUrl); // 添加时间戳防止缓存 String finalUrl = topUrl + "&t=" + System.currentTimeMillis(); // 预加载顶部 WebView topWebView.loadUrl("about:blank"); // 先加载空白页 // 然后再加载真实 URL new Handler(Looper.getMainLooper()).postDelayed(() -> { topWebView.loadUrl(finalUrl); }, 50); } private void SetUpMarquees(TextView textView) { textView.setText("S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整"); textView.setSelected(true); // 必须设置为 selected 才能启动 marquee textView.setFocusable(true); textView.setFocusableInTouchMode(true); textView.requestFocus(); // 强制获取焦点 } private void SetUpTheVideo() { // 视频文件的路径 String videoPath = "/storage/emulated/0/Download/DEFAULT.mp4"; // 创建 File 对象 File videoFile = new File(videoPath); // 检查文件是否存在 if (videoFile.exists()) { // 文件存在 Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show(); } else { // 文件存在 Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show(); } // 设置视频路径 videoView.setVideoPath(videoPath); // 添加控制器 MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // 播放视频 videoView.start(); } }); // 检查文件格式和编码是否受支持 videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (what == MediaPlayer.MEDIA_ERROR_UNSUPPORTED) { } // 处理支持的文件格式或编码 Log.e("VideoPlayer", "播放视频时发生错误. what: " + what + ", extra: " + extra); return false; } }); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTheWebPage(String value) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); // 注入接口对象 webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); Log.d("MainActivity3", "value 发生变化,加载"); Log.i("MainActivity3", "下边距web:" + value); switch (value) { case "0": // 加载网页 url = "http://192.168.2.36:8088/#/electrStation?deviceNo=ES02"; break; case "1": url = "http://192.168.2.36:8088/#/electrStation/greenTemp?deviceNo=ES02"; break; case "2": url = "http://192.168.2.36:8088/#/electrStation/purpleTemp?deviceNo=ES02"; break; } // 设置 WebViewClient 以在应用内打开页面 webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); webView.loadUrl(url); } public class JavascriptBroadcastInterfaces { private String lastBroadcast; // 保存上一次收到的 broadcast @JavascriptInterface public void getBroadcast(String broadcast) { Log.i("Broadcast", "Received broadcast: " + broadcast); // 如果新值和上次相同,直接返回 if (broadcast != null && broadcast.equals(lastBroadcast)) { Log.i("Broadcast", "重复的 broadcast,跳过播放"); return; } // 更新 lastBroadcast 为新的值 lastBroadcast = broadcast; // 构造音频 URL String audioUrl = "http://192.168.3.150:816/mp3?s=" + broadcast; if (isUrlReachable(audioUrl, MainActivity3.this)) { // 开始播放音频 Log.e("Broadcast", "音频 URL :" + audioUrl); playAudioWithExoPlayer(audioUrl); } else { Log.e("Broadcast", "音频 URL 可用"); } } SimpleExoPlayer player; private void playAudioWithExoPlayer(String audioUrl) { if (player != null) { player.release(); player = null; } TrackSelector trackSelector = new DefaultTrackSelector(); player = new SimpleExoPlayer.Builder(MainActivity3.this).setTrackSelector(trackSelector).build(); MediaItem mediaItem = MediaItem.fromUri(audioUrl); player.setMediaItem(mediaItem); player.prepare(); player.play(); } } @Override public void onBackPressed() { // 如果 WebView 可以返回,则返回上一页 if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } private boolean isUrlReachable(String audioUrl, Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo == null || !netInfo.isConnected()) { Log.e("Network", "No network connection"); return false; } try { URL url = new URL(audioUrl); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); urlConn.setConnectTimeout(3000); urlConn.setRequestMethod("HEAD"); int responseCode = urlConn.getResponseCode(); String contentType = urlConn.getContentType(); Log.d("URLCheck", "Response Code: " + responseCode); Log.d("URLCheck", "Content-Type: " + contentType); urlConn.disconnect(); return responseCode == HttpURLConnection.HTTP_OK; } catch (IOException e) { Log.e("URLCheck", "URL 可达", e); return false; } } @Override protected void onDestroy() { super.onDestroy(); // 停止定时任务 handler.removeCallbacks(refreshRunnable); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTopTheWebPageWithUrl(String topUrl) { WebSettings webSettings = topWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); topWebView.clearCache(true); topWebView.clearHistory(); String finalUrl = topUrl + "&t=" + System.currentTimeMillis(); topWebView.loadUrl("about:blank"); new Handler(Looper.getMainLooper()).postDelayed(() -> topWebView.loadUrl(finalUrl), 50); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTheWebPageWithUrl(String mainUrl) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); String finalUrl = mainUrl + "&t=" + System.currentTimeMillis(); webView.loadUrl("about:blank"); new Handler(Looper.getMainLooper()).postDelayed(() -> webView.loadUrl(finalUrl), 50); } }这个判断没有预加载效果,加了又会导致实时切换页面webView网页没效果
最新发布
08-02
你提到的这个问题非常典型:**预加载 URL 的 `WebView` 无法实时切换页面**,而如果加预加载逻辑,页面又可以正常切换。这说明问题出在 `WebView` 的加载方式和状态管理上。 --- ## ✅ 问题分析 ### 1. `WebView` 预加载逻辑的问题 你当前的预加载逻辑是这样的: ```java private void SetUpTheWebPageWithUrl(String mainUrl) { // 设置 WebSettings // 清除缓存 // 添加时间戳 String finalUrl = mainUrl + "&t=" + System.currentTimeMillis(); webView.loadUrl("about:blank"); new Handler(Looper.getMainLooper()).postDelayed(() -> webView.loadUrl(finalUrl), 50); } ``` 这段代码试图通过先加载空白页再加载目标 URL 来“预加载”,但 `WebView` 并是浏览器,它有自己的生命周期和缓存机制。这种“先 blank 再加载”的方式,可能导致: - **页面状态混乱**(页面未正确加载或渲染) - **历史栈混乱**(影响 `goBack()` 等行为) - **页面未正确渲染**(某些 JS 或资源未执行) ### 2. `WebView` 的缓存机制干扰了实时性 你虽然加了时间戳防止缓存,但 `WebView` 缓存机制复杂,可能仍存在缓存残留,导致页面没有更新。 --- ## ✅ 解决方案 ### ✅ 1. **去掉 `loadUrl("about:blank")` 这一步** 这是问题的根源之一。你需要先加载空白页,直接加载目标 URL 即可。 #### ✅ 修改 `SetUpTheWebPageWithUrl` 方法: ```java private void SetUpTheWebPageWithUrl(String mainUrl) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 使用缓存 webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { view.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); String finalUrl = mainUrl + "&t=" + System.currentTimeMillis(); webView.loadUrl(finalUrl); // 直接加载目标 URL,再先 blank } ``` 同样修改 `SetUpTopTheWebPageWithUrl` 方法。 --- ### ✅ 2. **设置合适的缓存模式** ```java webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 强制使用缓存 ``` 这样可以确保每次加载都是“干净”的。 --- ### ✅ 3. **在 `onPageFinished` 中注入 JS** 确保页面加载完成后再注入 JS 脚本: ```java @Override public void onPageFinished(WebView view, String url) { view.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } ``` --- ### ✅ 4. **避免重复初始化 `WebView` 设置** 你可以在 `onCreate` 中初始化一次 `WebView` 的设置,而是每次加载都设置一遍。 #### 示例: ```java private void initWebView(WebView webView) { WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setRenderPriority(WebSettings.RenderPriority.HIGH); settings.setJavaScriptCanOpenWindowsAutomatically(false); settings.setSupportMultipleWindows(false); settings.setBuiltInZoomControls(false); settings.setDisplayZoomControls(false); } ``` 然后在 `onCreate` 中: ```java initWebView(webView); initWebView(topWebView); ``` --- ## ✅ 最终修改后的 `SetUpTheWebPageWithUrl` 示例: ```java private void SetUpTheWebPageWithUrl(String mainUrl) { String finalUrl = mainUrl + "&t=" + System.currentTimeMillis(); webView.loadUrl(finalUrl); } ``` --- ## ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|-----------| | 页面无法加载或刷新 | 使用了 `loadUrl("about:blank")` | 去掉 blank,直接 loadUrl | | 页面加载慢或完整 | 缓存干扰 | 设置 `LOAD_NO_CACHE` | | JS 未执行 | 页面未加载完成 | 在 `onPageFinished` 中注入 JS | | 设置重复冗余 | 每次加载都设置 WebSettings | 提前初始化一次 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值