2012-05-08 13 views
8

Tôi có một MenuItem trong số ActionBar là biểu tượng "tải lại". My ActivityWebView và tôi muốn biểu tượng bắt đầu hoạt ảnh khi số WebView bắt đầu tải trang web và dừng khi trang web hoàn tất. Điều này bao gồm khi nhấp vào các liên kết trong trang web được tải. Những gì tôi có cho đến nay, hoạt động lần đầu tiên tôi xuất hiện trang web, nhưng nếu tôi rời khỏi trang web Activity và tải một trang web khác, biểu tượng "tải lại" có vẻ tăng gấp đôi hoặc tôi sẽ nhận được NullReference ngoại lệ được ném vào refreshItem.setActionView(ivRefresh);Bắt đầu hoạt ảnh khi tải trang, dừng trên trang được tải

enter image description here

đây là mã của tôi:

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); 
    } 
} 

mã nhận xét ra là những cách khác nhau tôi đã cố gắng để làm cho nó làm việc.

UPDATE:

Sau khi gỡ lỗi hơn này, tôi đặt một breakpoint trong StartAnimation chức năng và đôi khi nó nhấn lên đến 7 lần liên tiếp và lần khác nó không phải. Điều này không có ý nghĩa, đối với tôi, điều này sẽ hoạt động. Bối rối ...

SOLUTION (loại):

Cập nhật chức năng StartAnimation() đến nay, dường như khắc phục vấn đề này, nhưng dường như nhiều hơn một giải pháp băng keo:

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

Bạn có làm cho nó hoạt động không? làm sao? – Ronnie

+0

Tôi đã thêm giải pháp của mình vào OP. Kiểm tra nếu nó là null hoặc không cố định vấn đề của tôi. –

+0

Bạn đã thử tạo hoạt ảnh làm thành viên của lớp học chưa? – Ronnie

Trả lời

2

Để tạo trải nghiệm mượt mà, hoạt ảnh 'bánh xe tải' của bạn có thể bắt đầu khi người dùng nhấp vào liên kết - thay vì khi trang mới bắt đầu tải - và kết thúc khi trang mới đã tải. Điều này làm cho ứng dụng có vẻ phản hồi nhanh hơn cho người dùng và là hành vi được triển khai trong ví dụ Dolphin Browser.

Để thực hiện việc này, bạn cần phải nghe các nhấp chuột liên kết của người dùng trong WebView. Làm thế nào để làm điều này đã được đề cập trong câu trả lời này đây trên SO:

Detect click on HTML button through javascript in Android WebView

Bạn cần phải xác nhận rằng các nhấp chuột là trong thực tế vào một liên kết đến một trang mới. Bạn có thể tìm thấy phần tử HTML được nhấp qua lớp HitTestResult của WebView. Câu trả lời này trên SO cung cấp cho bạn thông tin chi tiết về làm thế nào để xác nhận giá trị HitTestResult:

Get the click event from webpage in my android application

Bạn bắt đầu hoạt hình của bạn từ phương pháp onClick() của bạn và kết thúc nó từ phương pháp của WebViewClient bạn onPageFinished() và, trong trường hợp trang mới không tải, cũng có trong onReceivedError().

+0

Ok, vâng, trải nghiệm ui mượt mà sang một bên, tôi vẫn còn bối rối vì sao bắt đầu hoạt ảnh trong 'onPageStarted' và dừng nó trong' onPageFinished' không hoạt động? –

0

Biến số Animation thành viên của lớp học Browser của bạn và đảm bảo bạn dừng hoạt ảnh trước khi rời khỏi hoạt động.

0

Bạn có thể sử dụng khái niệm chuỗi.

Để URL trong lượt xem Web tải, bạn hiển thị hoạt ảnh tải và khi URL được tải dừng hoạt ảnh.

Bạn cần sử dụng hai luồng, một cho chỉ báo tiến trình (ví dụ: Tải URL) và chuỗi giao diện người dùng khác cho hoạt ảnh của bạn.

Tìm kiếm!