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

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

enter image description here

Вот мой код:

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, и иногда она срабатывала до 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);
    }
}
8
задан Kris B 12 May 2012 в 01:00
поделиться