Запустить анимацию при загрузке страницы, остановить загрузку страницы

У меня есть MenuItem в моем ActionBar который является значком перезагрузки. Моя Activity имеет WebView и я хочу, чтобы значок начал анимацию, когда WebView начинает загружать веб-страницу и останавливается, когда она будет завершена. Это включает при нажатии на ссылки на загружаемом сайте. То, что у меня есть до сих пор, работает в первый раз, когда я открываю веб-страницу, но если я покину Activity и загрузите другую веб-страницу, значок «перезагрузить», похоже, удвоится или я NullReference исключение NullReference наброшенное на refreshItem.setActionView(ivRefresh);

Введите описание изображения здесь

Вот мой код:

 public class Browser extends SherlockFragmentActivity { private MenuItem refreshItem; private WebView mWebView; @Override public void onCreate(final Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.browser); mWebView = (WebView)findViewById(R.id.webview); mWebView.getSettings().setSupportZoom(true); mWebView.getSettings().setBuiltInZoomControls(true); mWebView.loadUrl("http://www.google.com"); mWebView.setWebViewClient(new WebBrowserClient()); mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { //if (!isFinishing() && progress == 100 && refreshItem != null && refreshItem.getActionView() != null) //{ //refreshItem.getActionView().clearAnimation(); //refreshItem.setActionView(null); //} } }); } private class WebBrowserClient extends WebViewClient { @Override public void onLoadResource(WebView view, String url) { //StartAnimation(); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { StartAnimation(); } @Override public void onPageFinished(WebView view, String url) { if (refreshItem != null && refreshItem.getActionView() != null) { refreshItem.getActionView().clearAnimation(); refreshItem.setActionView(null); } } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } private void StartAnimation() { final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null); final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh); ivRefresh.startAnimation(rotation); refreshItem.setActionView(ivRefresh); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu, menu); refreshItem = menu.findItem(R.id.refresh); return super.onCreateOptionsMenu(menu); } } 

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

ОБНОВИТЬ:

После отладки этого больше, я ставлю StartAnimation останова в функции StartAnimation и иногда она достигает 7 раз подряд, а в других случаях это не так. Это не имеет смысла, так как для меня это должно работать. Недоумение …

РЕШЕНИЕ (СОРТИРОВКА):

Обновление функции StartAnimation () для этого, похоже, устраняет эту проблему, но, похоже, больше подходит для решения проблемы с лентой:

 private void StartAnimation() { if (refreshItem != null && refreshItem.getActionView() == null) { final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null); final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh); ivRefresh.startAnimation(rotation); refreshItem.setActionView(ivRefresh); } } 

Solutions Collecting From Web of "Запустить анимацию при загрузке страницы, остановить загрузку страницы"

Чтобы создать гладкий ui-опыт, анимация «загрузочного колеса» должна начинаться, когда пользователь нажимает ссылку, а не на загрузку новой страницы, и заканчивается при загрузке новой страницы. Это делает приложение более восприимчивым к пользователю, и это поведение, реализованное в браузере Dolphin , в качестве примера.

Чтобы реализовать это, вам необходимо прослушать клики по ссылкам пользователя в WebView. Как это сделать, этот вопрос уже был рассмотрен здесь на SO:

Обнаруживать нажмите кнопку HTML через javascript в Android WebView

Вы должны подтвердить, что щелчок по сути является ссылкой на новую страницу. Вы можете найти элемент HTML с кликом через класс HitTestResult WebView . Этот ответ на SO дает вам подробную информацию о том, как проверить значение HitTestResult:

Получить событие клика с веб-страницы в приложении для Android

Вы начинаете анимацию с вашего метода onClick () и завершаете ее из метода onPageFinished () WebViewClient, и в случае, если новая страница не загружается, также в onReceivedError ().

Сделайте переменную Animation членом вашего класса Browser и убедитесь, что вы остановили анимацию перед выходом из нее.

Вы можете использовать концепцию потоков.

До загрузки URL-адреса в веб-представлении вы показываете анимацию загрузки и когда URL-адрес загружается, остановите анимацию.

Вам нужно использовать два потока: один для индикатора прогресса (т.е. URL-загрузка) и другой поток пользовательского интерфейса для вашей анимации.

Найдите его!