나는이 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 만 표시하려면 충분합니다.