简体   繁体   English

在WebView中加载URL时的进度栏

[英]Progress bar while URL loading in WebView

I have the below code to show a progress bar loading as the URL loads in WebView. 我有以下代码来显示进度栏的加载,以及URL在WebView中的加载。 However the line of code: 但是代码行:

webView.setWebViewClient(new MyWebViewClient());

has an error: 有一个错误:

The constructor MyWebViewClient() is undefined

What else is needed for this to work? 这项工作还需要什么?

WebViewActivity: WebViewActivity:

public class WebViewActivity extends Activity {

private WebView webView;


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);

ProgressBar pb = new ProgressBar(WebViewActivity.this);

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new MyWebViewClient(pb));
webView.loadUrl("http://www.google.com");

}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN){
    switch(keyCode)
    {
    case KeyEvent.KEYCODE_BACK:
        if(webView.canGoBack()){
            webView.goBack();
        }else{
            finish();
        }
        return true;
    }

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

MyWebViewActivity: MyWebViewActivity:

class MyWebViewClient extends WebViewClient {

private ProgressBar progressBar;

 public MyWebViewClient(ProgressBar pb) {
   this.progressBar=pb;
   pb.setVisibility(View.VISIBLE);}

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return super.shouldOverrideUrlLoading(view, url);
}

@Override
public void onPageFinished(WebView view, String url) {
    // TODO Auto-generated method stub
    super.onPageFinished(view, url);
    progressBar.setVisibility(View.GONE);
}

}

Crash Log: 崩溃日志:

10-17 20:18:35.774: E/AndroidRuntime(10492): FATAL EXCEPTION: main
10-17 20:18:35.774: E/AndroidRuntime(10492): java.lang.RuntimeException: Unable to start activity     ComponentInfo{app.myapp/app.myapp.WebViewActivity}: java.lang.NullPointerException
10-17 20:18:35.774: E/AndroidRuntime(10492):    at     android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.app.ActivityThread.access$600(ActivityThread.java:139)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.os.Looper.loop(Looper.java:156)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.app.ActivityThread.main(ActivityThread.java:4987)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at java.lang.reflect.Method.invokeNative(Native Method)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at java.lang.reflect.Method.invoke(Method.java:511)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at dalvik.system.NativeStart.main(Native Method)
10-17 20:18:35.774: E/AndroidRuntime(10492): Caused by: java.lang.NullPointerException
10-17 20:18:35.774: E/AndroidRuntime(10492):    at app.myapp.MyWebViewClient.<init>(MyWebViewClient.java:18)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at app.myapp.WebViewActivity.onCreate(WebViewActivity.java:23)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.app.Activity.performCreate(Activity.java:4538)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
10-17 20:18:35.774: E/AndroidRuntime(10492):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161)
10-17 20:18:35.774: E/AndroidRuntime(10492):    ... 11 more

The constructor MyWebViewClient() is undefined This error comes when used constructor is not available in Class. The constructor MyWebViewClient() is undefined如果使用的构造函数在Class中不可用,则会出现此错误。 As I can see you have only one Constructor public MyWebViewClient(ProgressBar progressBar) . 如我所见,您只有一个构造器public MyWebViewClient(ProgressBar progressBar) in MyWebViewClient Class MyWebViewClient类中

So you can not create instance of MyWebViewClient class without passing ProgressBar instance to the constructor. 因此,如果不将ProgressBar实例传递给构造函数,则无法创建MyWebViewClient类的实例。

public MyWebViewClient(ProgressBar progressBar) {
    this.progressBar=progressBar;
    progressBar.setVisibility(View.VISIBLE);
}

The constructor has a ProgressBar as an argument as shown above.You have to pass a progress bar as parameter. 构造函数将ProgressBar作为参数,如上所示。您必须传递进度条作为参数。

public class google extends Activity {
    WebView video_player_view;
    ProgressDialog pd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.google);
        video_player_view=(WebView)findViewById(R.id.webView1);
         video_player_view.getSettings().setJavaScriptEnabled(true);
           video_player_view.getSettings().setLoadsImagesAutomatically(true);
           video_player_view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
           video_player_view.setWebViewClient(new MyBrowser());
              video_player_view.loadUrl("YOUR URL");
              pd= new ProgressDialog(this);
              pd.setTitle("Webpage loading");
              pd.setCancelable(false);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_BACK:
                if(video_player_view.canGoBack()){
                    video_player_view.goBack();
                }else{
                    finish();
                }
                return true;
            }

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

     private class MyBrowser extends WebViewClient {
          @Override
          public boolean shouldOverrideUrlLoading(WebView view, String url) {
              view.loadUrl(url); 
              view.addJavascriptInterface(new Object()
              {
                  @JavascriptInterface
                public void performClick() throws Exception
                {
                    Log.d("LOGIN::", "Clicked");
                     Toast.makeText(google.this, "Login clicked", Toast.LENGTH_LONG).show();
                }
              }, "login");
             return true;
          }

          @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub

              System.out.println("started");
              pd.show();
            super.onPageStarted(view, url, favicon);



        }



          @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
              pd.dismiss();
              System.out.println("ends");
            super.onPageFinished(view, url);



        }
       }    

I recently implemented this and it works great for me: 我最近实现了它,对我来说非常有用:

private WebView socialWebView;
private ProgressDialog loadPageDialog;


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

    socialWebView = (WebView)findViewById(R.id.socialWebView);
    socialWebView.getSettings().setJavaScriptEnabled(true);
}


private void initData() {
    loadPageDialog = new ProgressDialog(this);
    loadPageDialog.setTitle("Loading...");
    loadPageDialog.setMessage("Please wait...");
    loadPageDialog.setCancelable(true);
    loadPageDialog.setCanceledOnTouchOutside(true);
    if(loadPageDialog != null && !loadPageDialog.isShowing()) {
        loadPageDialog.show();
    }

    socialWebView.setWebViewClient(new WebViewClient()
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            return false;
        }

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

        @Override
        public void onPageFinished(WebView view, String url) {
            if(loadPageDialog != null && loadPageDialog.isShowing()) {
                loadPageDialog.dismiss();
            }
        }

    });

}

After the page load the dialog will dismiss, hope this is what you are looking for 页面加载后,对话框将关闭,希望这是您想要的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM