2012-05-08 15 views
8

लोड किए गए पृष्ठ पर रुकें मेरे पास MenuItem है ActionBar जो कि "पुनः लोड" आइकन है। मेरे Activity में WebView है और मैं आइकन को एनिमेट करना प्रारंभ करना चाहता हूं जब 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

यहाँ मेरी कोड है।

अद्यतन:

इस अधिक डिबगिंग के बाद, मैं एक ब्रेकपाइंट 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); 
    } 
} 
+0

क्या आप इसे काम कर रहे थे? कैसे? – Ronnie

+0

मैंने ओपी को अपना समाधान जोड़ा। यह जांचना कि यह शून्य है या मेरी समस्या को ठीक नहीं किया गया है। –

+0

क्या आपने एनीमेशन को अपनी कक्षा के सदस्य के रूप में बनाने का प्रयास किया था? – Ronnie

उत्तर

2

एक चिकनी यूई-अनुभव बनाने के लिए, आपका 'लोडिंग व्हील' एनीमेशन शायद तब शुरू होना चाहिए जब उपयोगकर्ता लिंक पर क्लिक करता है - जब नया पृष्ठ लोड हो रहा है - और जब नया पृष्ठ लोड हो जाता है तो समाप्त होता है। यह ऐप को उपयोगकर्ता के लिए अधिक उत्तरदायी प्रतीत होता है, और यह उदाहरण उदाहरण के रूप में Dolphin Browser में लागू किया गया व्यवहार है।

इसे लागू करने के लिए, आपको वेबव्यू में उपयोगकर्ता के लिंक क्लिक सुनने की आवश्यकता है। यह पहले से ही यहाँ इतने पर इस जवाब में शामिल किया गया है कैसे करना है:

Detect click on HTML button through javascript in Android WebView

आप मान्य करने के लिए है कि क्लिक करें एक नया पृष्ठ पर एक लिंक पर वास्तव में क्या है। आप WebView के HitTestResult कक्षा के माध्यम से क्लिक किए गए HTML तत्व को पा सकते हैं। ,

Get the click event from webpage in my android application

आप अपने onClick() विधि से अपने एनीमेशन शुरू करने और अपनी WebViewClient के onPageFinished() विधि से इसका अंत और मामले में: इतने पर इस उत्तर आप कैसे HitTestResult मूल्य को मान्य करने पर विवरण देता है नया पेज लोड नहीं होता है, पर भी ReceivedError()।

+0

ठीक है, ठीक है, चिकनी यूई-अनुभव एक तरफ, मैं अभी भी उलझन में हूं कि 'onPageStarted' में एनीमेशन क्यों शुरू किया गया है और इसे' onPageFinished' में बंद कर दिया गया है? –

0

Animation अपने Browser कक्षा के सदस्य को परिवर्तनीय बनाएं और सुनिश्चित करें कि आप गतिविधि छोड़ने से पहले एनीमेशन को रोक दें।

0

आप धागे की अवधारणा का उपयोग कर सकते हैं।

वेब व्यू लोड में यूआरएल तक, आप लोडिंग एनीमेशन दिखाते हैं और जब यूआरएल लोड होता है तो एनीमेशन को रोकें।

आपको प्रगति संकेतक (यानी यूआरएल लोडिंग) और आपके एनीमेशन के लिए अन्य यूआई थ्रेड के लिए दो धागे का उपयोग करने की आवश्यकता है।

इसके लिए खोजें!

संबंधित मुद्दे