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

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

Для этого я использую ProgressBar. С таким расположением:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout [...]> <WebView android:id="@+id/WebView" android:layout_width="fill_parent" android:layout_height="fill_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); } } 

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

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

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

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

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

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

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

Имейте onPageFinished (), чтобы избавиться от индикатора прогресса (progressDialog.dismiss ())

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

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. По этой причине индикатор выполнения не будет отклонен. Чтобы решить эту проблему, см. Мой ответ .

Благодаря 🙂