android - वेबव्यू को यूआरएल लोड करने के लिए कैसे सुनें?




android-webview (9)

मेरे पास एक WebView जो इंटरनेट से एक पेज लोड कर रहा है। लोडिंग पूरा होने तक मैं ProgressBar दिखाना चाहता हूं।

मैं WebView के पेज लोडिंग को पूरा करने के लिए कैसे WebView ?


@ian यह 100% सटीक नहीं है। यदि आपके पास किसी पृष्ठ में कई आईफ़्रेम हैं तो आपके पास एकाधिक परपृष्ठ होगा (और ऑन पेज स्टार्ट)। और यदि आपके पास कई रीडायरेक्ट हैं तो यह भी असफल हो सकता है। यह दृष्टिकोण सभी समस्याओं को हल करता है (लगभग)

boolean loadingFinished = true;
boolean redirect = false;

mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
        if (!loadingFinished) {
            redirect = true;
        }

        loadingFinished = false;
        webView.loadUrl(urlNewString);
        return true;
    }

    @Override
    public void onPageStarted(WebView view, String url) {
        loadingFinished = false;
        //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        if (!redirect) {
           loadingFinished = true;
        }

        if (loadingFinished && !redirect) {
            //HIDE LOADING IT HAS FINISHED
        } else {
            redirect = false; 
        }
    }
});

अद्यतन करें:

प्रलेखन के अनुसार: ऑनपेज फ्रेम की सामग्री में परिवर्तन होने पर पेजस्टार्ट को तब नहीं कहा जाएगा, यानी एक लिंक पर क्लिक करना जिसका लक्ष्य आईफ्रेम है।

मुझे ट्विटर पर एक विशिष्ट मामला मिला जहां केवल एक पृष्ठ परिभाषित किया गया था और तर्क को थोड़ा सा गड़बड़ कर दिया गया था। हल करने के लिए मैंने एक्स सेकंड के बाद लोडिंग को हटाने के लिए एक निर्धारित कार्य जोड़ा। अन्य सभी मामलों में इसकी आवश्यकता नहीं है।

अद्यतन 2 :

अब वर्तमान एंड्रॉइड वेबव्यू कार्यान्वयन के साथ:

boolean loadingFinished = true;
boolean redirect = false;

    mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(
                WebView view, WebResourceRequest request) {
            if (!loadingFinished) {
               redirect = true;
            }

            loadingFinished = false;
            webView.loadUrl(request.getUrl().toString());
            return true;
        }

        @Override
        public void onPageStarted(
                WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            loadingFinished = false;
            //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if (!redirect) {
               loadingFinished = true;
            }

            if (loadingFinished && !redirect) {
                //HIDE LOADING IT HAS FINISHED
            } else {
                redirect = false; 
            }
        }
    });

आप WebView क्लास में getProgress विधि द्वारा प्रगति स्टॉस का पता लगा सकते हैं।

प्रगति की स्थिति शुरू करें

private int mProgressStatus = 0;

तो इस तरह लोड करने के लिए AsyncTask:

private class Task_News_ArticleView extends AsyncTask<Void, Void, Void> {
    private final ProgressDialog dialog = new ProgressDialog(
            your_class.this);

    // can use UI thread here
    protected void onPreExecute() {
        this.dialog.setMessage("Loading...");
        this.dialog.setCancelable(false);
        this.dialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            while (mProgressStatus < 100) {
                mProgressStatus = webview.getProgress();

            }
        } catch (Exception e) {

        }
        return null;

    }

    protected void onPostExecute(Void result) {
        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }
    }
}

बस प्रगति पट्टी दिखाने के लिए, "onPageStarted" और "onPageFinished" विधियां पर्याप्त हैं; लेकिन (के साथ साथ पेज पुनर्निर्देश, ...), यह तरीकों गैर अनुक्रमण के साथ की तरह "onPageStarted> onPageStarted> onPageFinished> onPageFinished" कतार निष्पादित कर सकते हैं, यदि आप एक "is_loading" झंडा करना चाहते हैं।

लेकिन मेरे छोटे परीक्षण के साथ (इसे स्वयं परीक्षण करें।), "ऑन प्रोग्रेस चेंज" विधि मान कतार "0-100> 0-100> 0-100> है ..."

private boolean is_loading = false;

webView.setWebChromeClient(new MyWebChromeClient(context));

private final class MyWebChromeClient extends WebChromeClient{
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress == 0){
            is_loading = true;
        } else if (newProgress == 100){
            is_loading = false;
        }
        super.onProgressChanged(view, newProgress);
    }
}

गतिविधि बंद होने पर " is_loading = false " भी सेट करें, यदि यह एक स्थिर चर है क्योंकि पृष्ठ समाप्त होने से पहले गतिविधि समाप्त हो सकती है।


मुझे एक सुरुचिपूर्ण समाधान भी मिला, मैंने इसका परीक्षण नहीं किया है हालांकि:

public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (m_webView.getProgress() == 100) {
                progressBar.setVisibility(View.GONE);
                m_webView.setVisibility(View.VISIBLE);
            }
        } 

मैंने इस तरह होने के लिए neteinstein कोड को सरल neteinstein दिया है:

mWebView.setWebViewClient(new WebViewClient() {
        private int       webViewPreviousState;
        private final int PAGE_STARTED    = 0x1;
        private final int PAGE_REDIRECTED = 0x2;

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
            webViewPreviousState = PAGE_REDIRECTED;
            mWebView.loadUrl(urlNewString);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            webViewPreviousState = PAGE_STARTED;
            if (dialog == null || !dialog.isShowing())
                dialog = ProgressDialog.show(WebViewActivity.this, "", getString(R.string.loadingMessege), true, true,
                        new OnCancelListener() {

                            @Override
                            public void onCancel(DialogInterface dialog) {
                                // do something
                            }
                        });
        }

        @Override
        public void onPageFinished(WebView view, String url) {

            if (webViewPreviousState == PAGE_STARTED) {
                dialog.dismiss();
                dialog = null;
            }

        }
 });

यह समझना आसान है, OnPageFinished अगर पिछले कॉलबैक पर आधारित कॉलबैक चालू है, तो पृष्ठ पूरी तरह से लोड हो गया है।


यदि आप एक प्रगति पट्टी दिखाना चाहते हैं तो आपको केवल पृष्ठ के पूरा होने के लिए प्रगति परिवर्तन ईवेंट सुनने की आवश्यकता नहीं है:

mWebView.setWebChromeClient(new WebChromeClient(){

            @Override
            public void onProgressChanged(WebView view, int newProgress) {

                //change your progress bar
            }


        });

बीटीडब्लू अगर आप केवल एक अनिश्चित प्रगतिबार प्रदर्शित करना चाहते हैं जिस पर विधि को ओवरराइड करना है, तो पर्याप्त है



WebViewClient कार्यान्वित WebViewClient और onPageFinished () निम्नानुसार है:

mWebView.setWebViewClient(new WebViewClient() {

   public void onPageFinished(WebView view, String url) {
        // do your stuff here
    }
});

SwipeRefreshLayout और ProgressBar साथ यूआरएल लोड हो रहा है:

UrlPageActivity.java:

    WebView webView;
    SwipeRefreshLayout _swipe_procesbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_url_page);


        String url = "http://.com/";

        _swipe_procesbar = (SwipeRefreshLayout)findViewById(R.id.url_path_swipe_procesbar);

        _swipe_procesbar.post(new Runnable() {
                                  @Override
                                  public void run() {
                                      _swipe_procesbar.setRefreshing(true);
                                  }
                              }
        );

        webView = (WebView) findViewById(R.id.url_page_web_view);
        webView.getSettings().setJavaScriptEnabled(true);

        webView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                _swipe_procesbar.setRefreshing(false);
                _swipe_procesbar.setEnabled(false);
            }
        });
        webView.loadUrl(url);
    }

activity_url_page.xml:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/url_path_swipe_procesbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.test.test1.UrlPageActivity">


            <WebView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/url_page_web_view" />
        </RelativeLayout>

</android.support.v4.widget.SwipeRefreshLayout>




android-webview