Показывать индикатор выполнения на дочерней вкладке, пока не загрузится WebView

В приложении для Android я использую TabView, и на одной из вкладок отображается WebView. Но страница пуста, пока веб-страница не загрузится. Как показать индикатор выполнения, пока страница не загрузится? Он не может быть в строке заголовка, потому что он скрыт хостом вкладки.


person brian    schedule 22.03.2010    source источник


Ответы (4)


Я использую для этого ProgressBar. С таким макетом:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout [...]>

  <WebView 
        android:id="@+id/WebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

  <ProgressBar 
       android:id="@+id/ProgressBar"
       android:layout_centerInParent="true"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       style="?android:attr/progressBarStyleLarge"
       android:visibility="gone"/>
</RelativeLayout>

Я скрываю и показываю индикатор выполнения, используя:

 WebView webView = (WebView) findViewById(R.id.WebView);

 final ProgressBar progess = (ProgressBar) findViewById(R.id.ProgressBar);

  webView.setWebViewClient(new WebViewClient() {
  public void onPageStarted(WebView view, String url, Bitmap favicon) {
    progess.setVisibility(View.VISIBLE);
  }

  public void onPageFinished(WebView view, String url) {
    progess.setVisibility(View.GONE);
  }
}
person beetstra    schedule 02.12.2011

На веб-сайте разработчиков Android есть действительно хорошее руководство по этому вопросу. . В нем показано, как создать диалоговое окно прогресса «вращающееся колесо», используемое во всех программах Android, и даже некоторые основы того, как обрабатывать загрузку в отдельном потоке, чтобы предотвратить зависание приложения во время загрузки.

person Steve Haley    schedule 22.03.2010
comment
Что касается загрузки страницы, вы можете прикрепить WebViewClient к WebView и узнать, когда страница загружается, чтобы вы знали, когда вы можете закрыть диалоговое окно. - person CommonsWare; 23.03.2010
comment
хорошо, но как перезапустить progressDialog при нажатии на ссылку внутри веб-просмотра? - person Samuel De Backer; 22.10.2010

Если ваш вопрос "как узнать, когда страница загружена?", то:

Создайте собственный подкласс WebViewClient, переопределив onPageFinished().

Прикрепите экземпляр вашего подкласса WebViewClient к вашему WebView через setWebViewClient()

Настройте индикатор неопределенного прогресса (полоса, диалог, RotateAnimation и т. д.)

progressDialog = ProgressDialog.show(this, "", getText(R.string.progressDialogText), true);

перед вызовом loadUrl() в WebView

Избавьтесь от индикатора прогресса onPageFinished() (progressDialog.dismiss())

person fmo    schedule 02.09.2010

После инициализации вашего представления просто вызовите этот метод

startWebView(web_view,"Your Url"); Здесь web_view — ваш инициализированный объект WebView. startWebView() приведен ниже:

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

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

Спасибо :)

person Md. Sajedul Karim    schedule 21.03.2016