В приложении для Android я использую TabView, и на одной из вкладок отображается WebView. Но страница пуста, пока веб-страница не загрузится. Как показать индикатор выполнения, пока страница не загрузится? Он не может быть в строке заголовка, потому что он скрыт хостом вкладки.
Показывать индикатор выполнения на дочерней вкладке, пока не загрузится WebView
Ответы (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);
}
}
На веб-сайте разработчиков Android есть действительно хорошее руководство по этому вопросу. . В нем показано, как создать диалоговое окно прогресса «вращающееся колесо», используемое во всех программах Android, и даже некоторые основы того, как обрабатывать загрузку в отдельном потоке, чтобы предотвратить зависание приложения во время загрузки.
WebViewClient
к WebView
и узнать, когда страница загружается, чтобы вы знали, когда вы можете закрыть диалоговое окно.
- person CommonsWare; 23.03.2010
Если ваш вопрос "как узнать, когда страница загружена?", то:
Создайте собственный подкласс 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. По этой причине индикатор выполнения не исчезнет. Чтобы решить эту проблему, см. мой ответ.
Спасибо :)