2012-05-08 2 views
8

나는 이 내 ActionBar에 있는데,이 애니메이션은 "다시로드"아이콘입니다. 내 ActivityWebView이며, 완료 될 때 WebView이 웹 페이지 로딩을 시작하고 정지 할 때 아이콘이 애니메이션으로 시작되기를 바랍니다. 여기에는로드 된 사이트의 링크를 클릭 할 때 포함됩니다. 내가 지금까지이 것은 내가 웹 페이지를 불러 처음 작동하지만이 Activity을 떠나 다른 웹 페이지를로드 할 경우 "새로 고침"아이콘을 두 배로 것, 또는 내가 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); 
    } 
} 

주석 처리 된 코드는 내가 일하러하려고 여러 가지 방법이다 : enter image description here

여기 내 코드입니다.

는 UPDATE :

이 더 디버깅 후, 나는 StartAnimation 함수에서 중단 점을 넣고 때때로는 그렇지 않은 행과 다른 시간에서 7 회까지 공격합니다. 나에게 이것이 작동해야하기 때문에 이것은 말이되지 않습니다. 당혹 ...

솔루션 (SORT의) :이에 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에 내 솔루션을 추가했습니다. null인지 확인하거나 문제가 해결되지 않았는지 확인하십시오. –

+0

애니메이션을 수업의 구성원으로 사용해 보셨습니까? – Ronnie

답변

2

부드러운 ui-experience를 만들려면 '새 페이지로드가 시작될 때가 아니라 링크를 클릭 할 때'로딩 휠 애니메이션이 시작되어야하고 새 페이지가로드 될 때 끝나야합니다. 이렇게하면 앱이 사용자에게보다 반응적으로 보일 수 있으며 예를 들어 Dolphin Browser에 구현 된 동작입니다.

이것을 구현하려면 WebView에서 사용자의 링크 클릭을 청취해야합니다. 이 아직 여기에이 응답에 포함 된 수행하는 방법 :

Detect click on HTML button through javascript in Android WebView

하는 당신은 클릭이 새 페이지에 링크 사실에 있는지 확인해야합니다. 클릭 한 HTML 요소는 WebView의 HitTestResult 클래스를 통해 찾을 수 있습니다. 케이스에, 당신은 당신의 onclick() 메소드에서 애니메이션을 시작하고 WebViewClient의 onPageFinished() 메소드에서을 종료하고

Get the click event from webpage in my android application

: SO의이 대답은 당신에게 HitTestResult 값을 확인하는 방법에 대한 세부 사항을 제공합니다 새 페이지가로드되지 않습니다. onReceivedError()에서도 마찬가지입니다.

+0

Ok, 음, 부드러운 경험을 제쳐두고, 나는 onPageStarted에서 애니메이션을 시작하고 onPageFinished에서 애니메이션을 멈추는 것이 왜 효과가 없는지 혼란 스럽습니다. –

0

변수가 Browser 클래스의 멤버가되도록하고 활동을 종료하기 전에 애니메이션을 중지하십시오.

0

스레드 개념을 사용할 수 있습니다.

웹보기에서 URL이로드 될 때까지로드 애니메이션 을 표시하고 URL로드시 애니메이션을 중지합니다.

진도 표시기 (즉, URL 로딩)와 애니메이션을위한 다른 UI 스레드를위한 두 개의 스레드를 사용해야합니다.

검색해보세요.

관련 문제