如何在加载图像之前在webview中实现进度对话框?

时间:2014-11-08 11:17:49

标签: android android-webview

我的应用中有一个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();
        }
    });

但是这似乎仍然会出现相同的错误

4 个答案:

答案 0 :(得分:2)

您尚未初始化进度对话框

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;
}

答案 1 :(得分:0)

我在WebView中使用过可能对您有帮助的内容:

WebChromeClient中设置onCreate()

<强> 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();
        }
    }
}

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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();
    }
}