2012-05-08 365 views
8

我在我的ActionBar中有一個MenuItem這是一個「重新加載」圖標。我的ActivityWebView,我希望這個圖標在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); 
    } 
} 

註釋掉的代碼是不同的方法,我試圖得到它的工作。

UPDATE:

調試這更後,我把一個斷點在StartAnimation功能,有時它的命中最多連續等次的7倍事實並非如此。這沒有任何意義,因爲對我而言,這應該是有效的。令人費解......

SOLUTION(差不多):

更新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); 
    } 
} 
+0

你有工作嗎?怎麼樣? – Ronnie

+0

我向OP添加了我的解決方案。檢查它是否爲空或沒有解決我的問題。 –

+0

您是否嘗試將動畫製作爲您班級的成員? – Ronnie

回答

2

要創建流暢的UI體驗,您的'加載輪'動畫應該可能在用戶單擊鏈接時開始 - 而不是在新頁面開始加載時 - 並在新頁面加載時結束。這使得該應用看起來對用戶更加敏感,並且作爲示例,其行爲在Dolphin Browser中實施。

要實現這一點,您需要監聽用戶在WebView中的鏈接點擊。如何做到這一點已經被覆蓋在這個答案在這裏SO:

Detect click on HTML button through javascript in Android WebView

您必須驗證該點擊實際上是鏈接到一個新的頁面上。您可以通過WebView的HitTestResult類找到單擊的HTML元素。在SO這個答案讓你如何驗證HitTestResult值的細節:

Get the click event from webpage in my android application

您從您的onClick()方法啓動動畫,並從WebViewClient的onPageFinished()方法結束它,並在情況下,新頁面不加載,也在onReceivedError()中。

+0

好吧,順利的ui-experience放在一邊,我仍然困惑,爲什麼在'onPageStarted'中啓動動畫並在'onPageFinished'中停止它不起作用? –

0

使Animation變成Browser類的成員,並確保在離開活動之前停止動畫。

0

您可以使用線程的概念。

直到網頁瀏覽加載中的網址,您顯示加載動畫 ,並加載URL時停止動畫。

您需要使用兩個線程,一個用於進度指示器(例如URL加載),另一個用於動畫的UI線程。

搜索了該產品!