簡體   English   中英

如何為 webview 中的每個頁面加載添加微調器加載

[英]How to add spinner loading for every pags loading in webview

我是一名初學者,在 AIED 中構建帶有閃屏的 webview 應用程序。

我想為 webview 中的每個頁面加載添加微調器加載。 我的意思是當這個 webview 在啟動畫面后加載時,當我打開任何其他頁面時,我可以看到網站的主頁。 在加載該頁面時,我想在屏幕中央顯示微調器。 當頁面加載時微調器應該消失。

我不知道在哪里添加特定的代碼。

這是mainactivity.java

package com.mystore.mominbaba;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;

public class MainActivity extends Activity {

    //private WebView webView = null;
    private WebView mWebView;
    private ImageView mSplashView;

    private ValueCallback <Uri> mUploadMessage;
    public ValueCallback <Uri[]> uploadMessage;
    public static final int REQUEST_SELECT_FILE = 100;
    private final static int FILECHOOSER_RESULTCODE = 1;

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

        mWebView = (WebView) findViewById(R.id.webview);
        mSplashView = (ImageView) findViewById(R.id.splash);
        mWebView.getSettings().setJavaScriptEnabled(true); // enable javascript
        mWebView.getSettings().setLoadWithOverviewMode(true); //sets Overview to true
        mWebView.getSettings().setUseWideViewPort(true); //sets wideviewport deleting whitespsce
        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        mWebView.getSettings().setAllowFileAccess(true);
        mWebView.setWebViewClient(new WebViewClient() {


            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                mSplashView.setVisibility(View.GONE);
                mWebView.setVisibility(View.VISIBLE);

            }
        });

        mWebView.loadUrl("https://www.mominbaba.com");
        mWebView.setVisibility(View.GONE);
        mSplashView.setVisibility(View.VISIBLE);


        mWebView.setWebChromeClient(new WebChromeClient() {
            // For 3.0+ Devices (Start)
            // onActivityResult attached before constructor
            protected void openFileChooser(ValueCallback uploadMsg, String acceptType) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
            }


            // For Lollipop 5.0+ Devices
            public boolean onShowFileChooser(WebView mWebView, ValueCallback <Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                if (uploadMessage != null) {
                    uploadMessage.onReceiveValue(null);
                    uploadMessage = null;
                }

                uploadMessage = filePathCallback;

                Intent intent = null;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                    intent = fileChooserParams.createIntent();
                }
                try {
                    startActivityForResult(intent, REQUEST_SELECT_FILE);
                } catch (ActivityNotFoundException e) {
                    uploadMessage = null;
                    return false;
                }
                return true;
            }

            //For Android 4.1 only
            protected void openFileChooser(ValueCallback <Uri> uploadMsg, String acceptType, String capture) {
                mUploadMessage = uploadMsg;
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);
            }

            protected void openFileChooser(ValueCallback <Uri> uploadMsg) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (requestCode == REQUEST_SELECT_FILE) {
                if (uploadMessage == null)
                    return;
                uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
                uploadMessage = null;
            }
        } else if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage)
                return;
            // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
            // Use RESULT_OK only if you're implementing WebView inside an Activity
            Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }
    }


    private class xWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }

        return super.
        `onKeyDown` (keyCode, event);
    }
}

這是活動 main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/splash"
        android:scaleType="fitXY"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:visibility="gone"
        android:src="@drawable/image_1"/>

    <WebView
        android:id="@+id/webview"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"/>

</RelativeLayout>

大警告:此解決方案不會完全隱藏必須下載和 load.js 文件的網站上的白屏(加載),尤其是在它們很大的情況下。

首先,您錯誤地使用onPageFinished onPageFinished總是會在每次頁面加載完成后被調用。 這意味着如果您在您的網站上導航,它會在您每次導航 URL 並且 webview 完成加載后調用onPageFinished

這是有關如何執行此操作的想法:

首先創建一個 HTML 頁面並設計您希望您的微調器的外觀。 將 HTML 模板保存為字符串HTMLSpinner

然后創建第二個 webview 並將 HTML 模板字符串加載到它

public WebView spinner;
spinner.loadData(HTMLSpinner, "text/html", "UTF-8");

然后像這樣修改你的主mWebView.setWebViewClient

        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, final String url, Bitmap favicon) {
                mWebView.setVisibility(View.GONE);
                spinner.setVisibility(View.VISIBLE);

                // YOUR LANDING PAGE
                if(url.equals("https://www.mominbaba.com")){
                    mWebView.setVisibility(View.GONE);
                    mSplashView.setVisibility(View.VISIBLE);

                }

            }

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

                mWebView.setVisibility(View.VISIBLE);
                spinner.setVisibility(View.GONE);

                // YOUR LANDING PAGE
                if(url.equals("https://www.mominbaba.com")){

                    mWebView.setVisibility(View.GONE);
                    mSplashView.setVisibility(View.VISIBLE);


                } 

            }

        });

這應該將您從主 webview 看到的當前 webview 交換到裝載機。 我選擇使用第二個 webview,因為所提供的資產是動畫 SVG。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM