У меня есть веб-представление для переопределения встроенного браузера, и я хочу показать индикатор хода выполнения в строке заголовка.
Это - код:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.browser);
currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL");
try {
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new browserActivityClient());
setProgressBarIndeterminateVisibility(true);
mWebView.loadUrl(currentURL);
setProgressBarIndeterminateVisibility(false);
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
Это должно работать, я думаю, согласно документам Android и другим образцам, которые я видел в сети. Но это не делает, Вы могли сказать мне, где я неправильно?
И другой вопрос: если иногда позже я приму решение объявить android:theme="@android:style/Theme.NoTitleBar"
в декларации приложения индикатор выполнения будет больше показывать или нет?
Спасибо.
На самом деле правильный код (протестирован и работает):
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
requestWindowFeature(Window.FEATURE_PROGRESS);
currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL");
setContentView(R.layout.browser);
setProgressBarIndeterminateVisibility(true);
setProgressBarVisibility(true);
try {
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new browserActivityClient());
mWebView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
setProgress(progress * 100);
if(progress == 100) {
setProgressBarIndeterminateVisibility(false);
setProgressBarVisibility(false);
}
}
});
mWebView.loadUrl(currentURL);
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
WebView.loadUrl выполняется в родном потоке, поэтому setProgressBarIndeterminateVisibility(false) вызывается немедленно, практически сразу. Также, если вы используете Theme.NoTitleBar, то строка заголовка не будет отображаться, а поскольку полоса прогресса находится в строке заголовка, то она тоже не будет отображаться.
Что-то вроде этого должно работать.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.browser);
currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL");
try {
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new browserActivityClient());
setProgressBarIndeterminateVisibility(true);
mWebview.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
if(progress == 100) {
setProgressBarIndeterminateVisibility(false);
}
}
});
mWebView.loadUrl(currentURL);
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}