URL로드가 완료된 WebView를 수신하는 방법은 무엇입니까? 때까지 표시하고 싶습니다 . 페이지로드가 완료된 것을

나는이 WebView인터넷에서 페이지를로드된다. ProgressBar로딩이 완료 될 때까지 표시하고 싶습니다 .

페이지로드가 완료된 것을 수신하려면 어떻게합니까 WebView?



답변

WebViewClient를 확장 하고 다음과 같이 onPageFinished ()를 호출 하십시오 .

mWebView.setWebViewClient(new WebViewClient() {

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

답변

@ian 이것은 100 % 정확하지 않습니다. 한 페이지에 여러 개의 iframe이있는 경우 여러 개의 onPageFinished (및 onPageStarted)가 있습니다. 리디렉션이 여러 개인 경우 실패 할 수도 있습니다. 이 접근 방식은 거의 모든 문제를 해결합니다.

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;
            //HIDE LOADING IT HAS FINISHED
        } else {
            redirect = false;
        }
    }
});

최신 정보:

설명서에 따르면 : 포함 된 프레임의 내용이 변경 될 때, 즉 대상이 iframe 인 링크를 클릭하면 onPageStarted가 호출되지 않습니다.

트위터에서 pageFinished 만 호출되고 논리가 약간 엉망 인 특정 사례를 발견했습니다. 이를 해결하기 위해 X 초 후에로드를 제거하는 예약 된 작업을 추가했습니다. 다른 모든 경우에는 이것이 필요하지 않습니다.

업데이트 2 :

현재 Android WebView 구현으로 :

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;
                //HIDE LOADING IT HAS FINISHED
            } else {
                redirect = false;
            }
        }
    });

답변

나는 @NeTeInStEiN (및 @polen) 솔루션에 꽤 부분적이지만 여러 부울 또는 상태 감시자 대신 카운터로 구현했을 것입니다 (다른 맛이지만 공유 할 수 있다고 생각했습니다). 그것에 대해 JS 뉘앙스가 있지만 논리가 이해하기 쉽다고 생각합니다.

private void setupWebViewClient() {
    webView.setWebViewClient(new WebViewClient() {
        private int running = 0; // Could be public if you want a timer to check.

        @Override
        public boolean shouldOverrideUrlLoading(WebView webView, String urlNewString) {
            running++;
            webView.loadUrl(urlNewString);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            running = Math.max(running, 1); // First request move it to 1.
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if(--running == 0) { // just "running--;" if you add a timer.
                // TODO: finished... if you want to fire a method.
            }
        }
    });
}

답변

하나의 우아한 솔루션을 찾았지만 엄격하게 테스트하지 않았습니다.

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 의 코드를 다음과 같이 단순화 했습니다.

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

        }
 });

이전 콜백이 onPageStarted에 있으면 OnPageFinished를 쉽게 이해할 수 있으므로 페이지가 완전히로드됩니다.


답변

진행률 표시 줄을 표시하려면 페이지 완료뿐만 아니라 진행률 변경 이벤트를 수신해야합니다.

mWebView.setWebChromeClient(new WebChromeClient(){

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

                //change your progress bar
            }


        });

BTW onPageFinished 메서드를 재정의하는 Indeterminate ProgressBar 만 표시하려면 충분합니다.