8

「リロード」アイコンが私のMenuItem中にあります。ActionBarActivityには があり、ウェブページの読み込みが開始WebViewされたときにアイコンのアニメーションを開始し、終了したらアイコンを停止したいと考えています。WebViewこれには、読み込まれたサイト内のリンクをクリックしたときも含まれます。これまでのところ、Webページを初めて表示したときに機能しますが、Activity別のWebページを離れてロードすると、「リロード」アイコンが2倍になるように見えるか、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関数にブレークポイントを設定すると、連続して最大 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);
    }
}
4

3 に答える 3

2

スムーズな UI エクスペリエンスを作成するには、「ロード ホイール」アニメーションは、新しいページの読み込みが開始されたときではなく、ユーザーがリンクをクリックしたときに開始し、新しいページが読み込まれたときに終了する必要があります。これにより、ユーザーに対するアプリの応答性が向上し、例としてDolphin Browserで実装された動作になります。

これを実装するには、WebView でユーザーのリンク クリックをリッスンする必要があります。これを行う方法は、SO のこの回答で既に説明されています。

Android WebViewでjavascriptを介してHTMLボタンのクリックを検出する

クリックが実際に新しいページへのリンクであることを検証する必要があります。クリックされた HTML 要素は、WebView のHitTestResultクラスを介して見つけることができます。SO に関するこの回答では、HitTestResult 値を検証する方法について詳しく説明しています。

Android アプリケーションの Web ページからクリック イベントを取得する

onClick() メソッドからアニメーションを開始し、WebViewClient の onPageFinished() メソッドからアニメーションを終了します。新しいページが読み込まれない場合は、onReceivedError() でも終了します。

于 2012-05-11T10:03:13.170 に答える
0

Animation変数をBrowserクラスのメンバーにして、アクティビティを終了する前にアニメーションを停止してください。

于 2012-05-12T16:45:11.593 に答える
0

スレッドの概念を使用できます。

Web ビューで URL が読み込まれるまで読み込みアニメーションを表示し、URL が読み込まれるとアニメーションを停止します。

2 つのスレッドを使用する必要があります。1 つは進行状況インジケーター (つまり、URL の読み込み) 用で、もう 1 つはアニメーション用の UI スレッドです。

それを検索してください!

于 2012-05-18T06:40:55.293 に答える