웹뷰에서 URL링크 클릭할 때 외부 브라우져를 검색하는 선택 대화상자가 뜬다.
이 것을 막으려면 어떻게 해야할까?
"shouldOverrideUrlLoading()를 두고 true를 리턴하면 된다"라고 많은 문서에서 잘 못 설명하고 있다.
setWebViewClient(new WebViewClient()); 한줄이면 끝이다. 더는 대화상자 나오지 않는다.
그럼 shouldOverrideUrlLoadig()는 뭘까?
우선 setWebViewClient(new OrginWebViewClient());와 같이 WebViewClient를 상속한 객체를 등록해준다.
명확하게 설명해주는 블로그나 사이트가 없다시피했다. 그래서 shouldOverrideUrlLoading API문서를 수차례 읽고 테스트하고 읽고를 반복했다. 수차례라고 하지만 며칠 보냈다. 그도 그럴것이 정확히 이해를 못하면 이 동작이나 저동작이 다 비슷해 보인다. 클레스 WebChromeClient과 클레스 WebViewClient 동작이 얼핏 비슷비슷하다.
shouldOverrideUrlLoading::
https://developer.android.com/reference/android/webkit/WebViewClient.html
정확히 짧게 설명한다.
shouldOverrideUrlLoading() 역할은 return 값으로 링크를 어떻게 처리할 까를 결정한다. true를 리턴하면 웹뷰를 포함하고 있는 앱이 처리한다. (위 API 레퍼런스에서) 호스트라고 일컷는 것이다. 쉽게 말해 내가 지금 만들고 있는 앱(== 호스트)이다. 더 파고 내려가면 해당 웹뷰를 보여주는 Activity(=== host)가 된다. false를 리턴하면 지금 WebView가 처리한다이다.
이 문구를 정확히 이해하면 그 다음은 고속도로이다.
public class OrginWebViewClient extends WebViewClient {
// rurl
// shouldOverrideUrlLoading()함수를
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(IsDebugging) Log.d(TAG, ":: shouldOverrideUrlLoading(WebView view, String url)");
view.loadUrl(url);
return true;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if(IsDebugging) Log.d(TAG, ":: shouldOverrideUrlLoading(WebView view, WebResourceRequest request)");
final Uri uri = request.getUrl();
final String host = uri.getHost();
final String scheme = uri.getScheme();
view.loadUrl(uri.toString());
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if(IsDebugging) Log.d(TAG, "onPageStarted()");
super.onPageStarted(view, url, favicon);
}
}
참고:
http://stackoverflow.com/questions/36484074/is-shouldoverrideurlloading-really-deprecated-what-can-i-use-instead
http://stackoverflow.com/questions/27009995/android-webview-links-to-same-window-with-target-blank-to-open-new-window
'Android 안드로이드' 카테고리의 다른 글
Firebase Cloud Message 푸시 노티피케이션 Push Notification (0) | 2017.04.20 |
---|---|
자주 사용하는 OptionsMenu 템플릿 (0) | 2017.03.28 |
configure your build for VectorDrawableCompat. (0) | 2016.10.29 |
안드로이드 API 23 레벨로 SDK 업데이트 후 (0) | 2015.09.23 |
안드로이드 프로젝트에 빨간 사각형 바탕에 희색 x 표시가 뜬다. (0) | 2015.09.22 |