35

Я пытаюсь добавить панель выполнения/загрузки в мое приложение, которое использует WebView. Я смущен тем, как реализовать индикатор выполнения, который появляется при каждом нажатии ссылки.Добавить панель выполнения в WebView

Текущий код:

public class CULearnBrowser extends Activity { 

    WebView webview; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     webview = (WebView) findViewById(R.id.webview); 
     webview.setWebViewClient(new HelloWebViewClient()); 
     webview.getSettings().setJavaScriptEnabled(true); 
     webview.loadUrl("https://culearn.colorado.edu/webct/entryPageIns.dowebct"); 
    } 

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

    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { 
      webview.goBack(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 

раскладка активность:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <WebView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 
</LinearLayout> 
+1

возможно дубликат [Android WebView прогресс бар] (http://stackoverflow.com/questions/2537454/android-webview -progress-bar) – 2013-09-04 22:56:08

+0

Как скачать pdf или doc на кнопке клика по WebView – 2017-04-03 06:41:40

+0

Ответ, который вы ищете, очень подробно здесь: http://www.giantflyingsaucer.com/blog/?p=1331 – andufo 2011-04-22 05:32:30

ответ

59

Это link может помочь вам.

Я добавил несколько строк в ваш код, и теперь он работает отлично с индикатором выполнения.

 getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     setContentView(R.layout.main); 
     // Makes Progress bar Visible 
     getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 

     webview = (WebView) findViewById(R.id.webview); 
     webview.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) 
      { 
       //Make the bar disappear after URL is loaded, and changes string to Loading... 
       setTitle("Loading..."); 
       setProgress(progress * 100); //Make the bar disappear after URL is loaded 

       // Return the app name after finish loading 
       if(progress == 100) 
        setTitle(R.string.app_name); 
       } 
      }); 
     webview.setWebViewClient(new HelloWebViewClient()); 
     webview.getSettings().setJavaScriptEnabled(true); 
     webview.loadUrl("http://www.google.com"); 
+0

ive видели такие вещи, но я не знаю, как это сделать с моим кодом – Sean 2010-12-02 03:49:20

6

Помещенный прогресс бар и WebView внутри RelativeLayout и установить свойства для индикатора выполнения следующим образом,

  1. сделать его видимость, как GONE.
  2. CENTER it in Relativelayout.

, а затем в onPageStarted() веб-клиента сделать индикатор выполнения видимым так, чтобы он показывал панель прогресса, когда вы нажимали на ссылку. В onPageFinished() сделать видимость видимости прогресса как GONE, чтобы она исчезла, когда страница закончила загрузку ... Это будет отлично работать для вашего сценария. Надеюсь, это поможет ...

13

in oncreate метод, в котором вы установили свой веб-просмотр.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
// TODO Auto-generated method stub 
super.onCreate(savedInstanceState); 

this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
setContentView(R.layout.web_view); 

web_view = (WebView) findViewById(R.id.web_view); 
pd = new ProgressDialog(SiteOpenInWebView.this); 
    pd.setMessage("Please wait Loading..."); 
    pd.show(); 
    web_view.setWebViewClient(new MyWebViewClient()); 
    web_view.loadUrl("ur site name"); 
} 

WebViewClient

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

    if (!pd.isShowing()) { 
     pd.show(); 
    } 

    return true; 
} 

@Override 
public void onPageFinished(WebView view, String url) { 
    System.out.println("on finish"); 
    if (pd.isShowing()) { 
     pd.dismiss(); 
    } 

    } 
} 
7

Вот код, который я использую:

Внутри WebViewClient:

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

       super.onPageStarted(view, url, favicon); 
       findViewById(R.id.progress1).setVisibility(View.VISIBLE); 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       findViewById(R.id.progress1).setVisibility(View.GONE); 
      } 

Вот XML:

<ProgressBar 
    android:id="@+id/progress1" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

Надеется, что это помогает ..

10

передать свой адрес в этом методе

private void startWebView(String url) { 

     WebSettings settings = webView.getSettings(); 

     settings.setJavaScriptEnabled(true); 
     webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); 

     webView.getSettings().setBuiltInZoomControls(true); 
     webView.getSettings().setUseWideViewPort(true); 
     webView.getSettings().setLoadWithOverviewMode(true); 

     progressDialog = new ProgressDialog(ContestActivity.this); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.show(); 

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

      @Override 
      public void onPageFinished(WebView view, String url) { 
       if (progressDialog.isShowing()) { 
        progressDialog.dismiss(); 
       } 
      } 

      @Override 
      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       Toast.makeText(ContestActivity.this, "Error:" + description, Toast.LENGTH_SHORT).show(); 

      } 
     }); 
     webView.loadUrl(url); 
    } 
1

Вы можете попробовать этот код в вашу деятельность

private void startWebView(WebView webView,String url) { 
webView.setWebViewClient(new WebViewClient() { 
      ProgressDialog progressDialog; 

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

      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(view, url, favicon); 
      } 

      public void onLoadResource (WebView view, String url) { 

        if (progressDialog == null) { 
         progressDialog = new ProgressDialog(SponceredDetailsActivity.this); 
         progressDialog.setMessage("Loading..."); 
         progressDialog.show(); 
        } 

      } 
      public void onPageFinished(WebView view, String url) { 
       try{ 
        if (progressDialog.isShowing()) { 
         progressDialog.dismiss(); 
         progressDialog = null; 
        } 

       }catch(Exception exception){ 
        exception.printStackTrace(); 
       } 
      } 

     }); 

     webView.getSettings().setJavaScriptEnabled(true); 
     webView.loadUrl(url); 
    } 

этого метод, используя этот способ вызова:

startWebView(web_view,"Your Url"); 

Иногда, если URL-адрес мертв, он будет перенаправлен, и он будет включен в onLoadResource() до метода onPageFinished. По этой причине индикатор выполнения не будет отменен. Чтобы решить эту проблему, см. my this Answer.

Спасибо :)

3

Лучший Approch, который работал для меня

webView.setWebViewClient(new WebViewClient() { 

    @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      mProgressBar.setVisibility(ProgressBar.VISIBLE); 
      webView.setVisibility(View.INVISIBLE); 
     } 

    @Override public void onPageCommitVisible(WebView view, String url) { 
     super.onPageCommitVisible(view, url); 
     mProgressBar.setVisibility(ProgressBar.GONE); 
     webView.setVisibility(View.VISIBLE); 
     isWebViewLoadingFirstPage=false; 
    } 
} 
Смежные вопросы