【问题标题】:How to implement the Progress Dialog in webview before loading an image?如何在加载图像之前在 webview 中实现进度对话框?
【发布时间】:2016-05-10 13:49:19
【问题描述】:

我的应用程序中有一个 webview 必须加载图像,它可以很好地加载,但是它需要几秒钟才能显示。所以我需要做的是显示一个进度对话框来通知用户页面正在加载。 (这张图片是从资产文件夹而不是从网络加载的)所以这是我到目前为止的代码,但是当我尝试运行该活动时崩溃了。

public MapsFragment(){}
ProgressDialog progress;
WebView myWebView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_maps, container, false);

    WebView webview = (WebView)rootView.findViewById(R.id.webView2);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setLoadWithOverviewMode(true);
    webview.getSettings().setBuiltInZoomControls(true);
    webview.getSettings().setUseWideViewPort(false);
    webview.loadUrl("file:///android_asset/index1.html");

    webview.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            progress.show();
            view.loadUrl(url);
            return true;                
        }
        @Override
        public void onPageFinished(WebView view, final String url) {
            progress.dismiss();
        }
    });

    return rootView;
 }
}

然后这个错误代码是:

11-08 13:19:34.034: E/AndroidRuntime(20600): FATAL EXCEPTION: main
11-08 13:19:34.034: E/AndroidRuntime(20600): Process: com.test.testguide, PID: 20600
11-08 13:19:34.034: E/AndroidRuntime(20600): java.lang.NullPointerException
11-08 13:19:34.034: E/AndroidRuntime(20600):    at com.test.testguide.MapsFragment$1.onPageFinished(MapsFragment.java:42)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at com.android.webview.chromium.WebViewContentsClientAdapter.onPageFinished(WebViewContentsClientAdapter.java:449)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at com.android.org.chromium.android_webview.AwContentsClient$AwWebContentsObserver$1.run(AwContentsClient.java:73)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at android.os.Handler.handleCallback(Handler.java:733)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at android.os.Handler.dispatchMessage(Handler.java:95)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at    android.os.Looper.loop(Looper.java:136)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at android.app.ActivityThread.main(ActivityThread.java:5586)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at java.lang.reflect.Method.invokeNative(Native Method)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at java.lang.reflect.Method.invoke(Method.java:515)

请帮忙,因为我用谷歌搜索了很多关于此的问题,但似乎找不到解决方案。
谢谢!

编辑

我已通过 myWebView 更正错误并改回 webview,从而导致新的错误。请查看更新的问题

EDIT2

@Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            progress = new ProgressDialog(getActivity());
            progress.setMessage("Please wait...");
            progress.setIndeterminate(false);
            progress.setCancelable(false);
            progress.show();
            view.loadUrl(url);
            return true;                
        }
        @Override
        public void onPageFinished(WebView view, final String url) {
            progress.dismiss();
        }
    });

但这似乎仍然会因相同的错误而崩溃

【问题讨论】:

  • 你还没有初始化你的进度对话框...尝试初始化它并运行
  • 我将如何初始化它?
  • progress= ProgressDialog.show(this, "Title","Message", true);在尝试显示进度之前
  • 哦,好吧,现在已经尝试过了,但后来发生了这种情况The method show(Context, CharSequence, CharSequence, boolean) in the type ProgressDialog is not applicable for the arguments (new WebViewClient(){}, String, String, boolean)
  • 仍然面临问题或已解决?

标签: android android-webview


【解决方案1】:

你还没有初始化你的进度对话框,

progress= ProgressDialog.show(this, "Title","Message", true);

或者,

        progress= new ProgressDialog(getActivity());
        progress.setMessage("Please wait...");
        progress.setIndeterminate(false);
        progress.setCancelable(false);
        progress.show();

你可以调用progress.dismiss()来隐藏对话框

编辑

View rootView = inflater.inflate(R.layout.fragment_maps, container, false);
WebView webview = (WebView)rootView.findViewById(R.id.webView2);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setUseWideViewPort(false);
webview.loadUrl("file:///android_asset/index1.html");
progress= new ProgressDialog(getActivity());
webview.setWebViewClient(new WebViewClient(){
  @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        progress.setMessage("Please wait...");
        progress.setIndeterminate(false);
        progress.setCancelable(false);
        progress.show();
        view.loadUrl(url);
        return true;                
    }
    @Override
    public void onPageFinished(WebView view, final String url) {
        progress.dismiss();
    }
});

return rootView;
}

【讨论】:

  • 它仍然在 onPageFinished (Null Pointer exception) 给我一个错误所以我认为@Override public void onPageFinished(WebView view, final String url) { progress.dismiss(); 有一个问题
  • put progress= new ProgressDialog(getActivity());在 webview.setWebViewClient(new WebViewClient(){ 这行之前再试一次
  • 你在 shouldOverrideUrlLoading 方法中初始化进度,在 onPageFinished 中不可见。所以尝试在 setWebViewClient 方法之外初始化它
  • 这似乎可行,但现在最后一个问题是对话框在图像显示前 2 秒消失?有没有告诉它显示更长时间,直到图像加载或对其设置时间限制?
  • 使用我的解决方案,这对你来说会更好...带有进度显示。
【解决方案2】:

我在我的WebView 中使用过可能对你有帮助的:

onCreate() 中设置WebChromeClient 喜欢

webView.setWebChromeClient(new MyWebChromeClient());

class MyWebChromeClient extends WebChromeClient {

    ProgressDialog pDialog;

    public MyWebChromeClient() {
        // TODO Auto-generated constructor stub
        pDialog = new ProgressDialog(YourActivity.this); //Use getActivity(); for Fragment
        pDialog.setMessage("Loading...");
        pDialog.setCancelable(false);
        pDialog.setProgress(0);
        pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    }

    public void onProgressChanged(WebView view, int progress) 
    {
        if(progress < 100 && !pDialog.isShowing()){
            pDialog.show();
        }
        pDialog.setProgress(progress);
        if(progress == 100) {
            pDialog.dismiss();
        }
    }
}

【讨论】:

    【解决方案3】:

    你可以在加载资源时做这样的事情

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url); 返回真; }

        public void onLoadResource (WebView view, String url) {
            if (progressDialog == null) {
                progressDialog = new ProgressDialog(activity);
                progressDialog.setMessage("Loading... ");
                progressDialog.show();
            }
        }
    

    【讨论】:

    • 您将如何关闭此进度对话框...?
    • 你必须执行 didloadrequest 或 didfailed 因为无论哪种方式你都想停止你的进步
    【解决方案4】:

    我做了类似的事情,在页面开始加载时显示一条消息,并在结束时关闭它:

    package com.veemesoft.radiostream.radiostream;
    
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ImageButton;
    import android.widget.TextView;
    public class WebViewActivity extends Activity {
    
        private WebView webView;
        ImageButton goBack;
        TextView webViewTitle;
        ProgressDialog progressDialog;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_web_view);
            webViewTitle = (TextView) findViewById(R.id.web_view_title);
            String webViewTitleString = this.getIntent().getStringExtra("web_view_title");
            webViewTitle.setText(webViewTitleString);
            goBack = (ImageButton) findViewById(R.id.go_back);
    
            goBack.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    goToMainActivity();
                }
            });
    
            webView = (WebView) findViewById(R.id.webView);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setLoadWithOverviewMode(true);
            webView.getSettings().setBuiltInZoomControls(true);
            webView.getSettings().setUseWideViewPort(false);
            progressDialog = new ProgressDialog(this);
            webView.setWebViewClient(new WebViewClient() {
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    progressDialog.setMessage("Espere unos segundos...");
                    progressDialog.setIndeterminate(true);
                    progressDialog.setCancelable(false);
                    progressDialog.show();
                }
    
                @Override
                public void onPageFinished(WebView view, final String url) {
                    progressDialog.dismiss();
                }
            });
            String url = this.getIntent().getStringExtra("url");
            webView.loadUrl(url);
        }
    
        private void goToMainActivity(){
            finish();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多