首页 > 解决方案 > Android Studio中WebView内部链接的进度条

问题描述

我有一个用 Android Studio 开发的 WebView。我想实现一个进度条出现在 WebView 的每个内部页面上。

我给你看代码。虽然我必须澄清一下,该应用程序已经有一个进度条,它完成了启动画面的功能。

我想要的是,当在 WebView 中打开一个链接时,会出现一个进度条,指示页面正在加载,因为当打开一个链接时,用户的屏幕会瘫痪几秒钟,直到它完全加载,这对裸体来说可能很烦人眼睛。

初步代码:

主要活动

package com.example.app;

import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ProgressBar;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    String ShowOrHideWebViewInitialUse = "show";
    private ProgressBar spinner;

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

        WebView webview = (WebView) findViewById(R.id.webView);
        spinner = (ProgressBar) findViewById(R.id.progressBar1);
        webview.setWebViewClient(new CustomWebViewClient());

        webview.getSettings().setJavaScriptEnabled(true);
        webview.getSettings().setDomStorageEnabled(true);
        webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
        webview.loadUrl("https://www.example.com");
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        WebView miVisorWeb;
        miVisorWeb = (WebView) findViewById(R.id.webView);
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            switch (keyCode) {
                case KeyEvent.KEYCODE_BACK:
                    if (miVisorWeb.canGoBack()) {
                        miVisorWeb.goBack();
                    } else {
                        finish();
                    }
                    return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private class CustomWebViewClient extends WebViewClient {

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

            if (ShowOrHideWebViewInitialUse.equals("show")) {
                webview.setVisibility(View.INVISIBLE);
            }
        }

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

            ShowOrHideWebViewInitialUse = "hide";
            spinner.setVisibility(View.GONE);

            view.setVisibility(View.VISIBLE);
            super.onPageFinished(view, url);

        }
    }
}

如果您可以实现另一个不填满整个屏幕的进度条,这将是一个很大的帮助,它在加载 WebView 中的链接时显示,然后在加载完成时消失。

非常感谢你!

标签: androidwebview

解决方案


代替 Spinner 进度条,您可以通过更改样式来使用水平条。

<ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        --- other attributes here ---
         />

将此水平进度条放置在 webview 的顶部,类似于下图。

进度条模型

此外,通过设置chromeWebClientwebview 和覆盖onProgressChanged方法,我们可以获得页面加载的进度,可以设置为水平进度条。

webView.setWebChromeClient(new WebChromeClient() {
    public void onProgressChanged(WebView view, int newProgress) {
       progressBar.setProgressCompat(newProgress, true)
    }
});

推荐阅读