URL을 클릭하면 기본 브라우저가 열립니다


209

에 외부 URL을로드했습니다 WebView. 이제 필요한 것은 사용자가로드 된 페이지의 링크를 클릭하면 일반 브라우저처럼 작동하고 동일한 링크를 열어야한다는 것 WebView입니다. 그러나 기본 브라우저를 열고 페이지를로드하고 있습니까?

JavaScript를 활성화했습니다. 그러나 여전히 작동하지 않습니다. 내가 잊어 버렸습니까?

답변:


353

를 사용하는 WebView경우 기본 Android 동작을 원하지 않으면 클릭을 직접 가로 채야합니다.

WebView사용하여 이벤트를 모니터링 할 수 있습니다 WebViewClient. 원하는 방법은 shouldOverrideUrlLoading()입니다. 이를 통해 특정 URL을 선택할 때 자신의 작업을 수행 할 수 있습니다.

당신은 설정 WebViewClient당신이의 WebView사용 setWebViewClient()방법 .

WebViewSDK 에서 샘플 을 보면 원하는 것을 수행하는 예제가 있습니다. 다음과 같이 간단합니다.

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

97
이것이 기본 동작 인 것처럼 보이며 이것이 WebViewClient전부라면 서브 클래 싱이 필요하지 않습니다. 이 작업을 수행하면됩니다myWebView.setWebViewClient(new WebViewClient());
Adam

7
@ dave-webb는 loadUrl을 호출하지 않도록 샘플을 업데이트하십시오. 이것을 읽는 사람은-코드를 복제하지 마십시오 (view.loadUrl을 호출하는 대신 콜백에서 false를 반환하십시오). loadUrl을 호출하면 사용자 정의 구성표 URL (예 : <iframe src = "tel : 123"/>)이있는 페이지 내에 iframe이있는 경우 앱의 메인 프레임을 해당 URL로 탐색하여 가장 가능성이 높은 부작용.
marcin.kosiba

1
@Adam ++-예 나도 이것을 보았습니다. 내 웹보기 중 하나가 시스템 브라우저를 사용하지 않는 이유를 이해할 수 없었습니다. 왜냐하면 다른 방법을 재정의하는 새로운 웹 클라이언트를 추가했기 때문입니다. 디버깅하는 데 시간이 걸렸습니다.
Peter Ajtai

onLongClick, 외부 브라우저에서 열린 링크와 같은 것을 구현할 수 있습니까?
TheOnlyAnil

54

경우에 따라 URL로드 방법을 트리거하지 않는 리디렉션을 받으면 onLoadResource를 재정의해야 할 수도 있습니다. 이 경우 다음을 시도했습니다.

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}

대단해! 웹보기의 링크에서 MP3 파일을 재생하는 방법을 해결하는 데 많은 시간을 절약했습니다. 많은 부동산 감사합니다!
Brigante

25

공식 문서에 따르면 WebView에서 링크를 클릭하면 URL을 처리하는 응용 프로그램이 시작됩니다. 이 기본 동작을 재정의해야합니다.

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

또는 메소드에 조건부 논리가 없으면 간단히 다음을 수행하십시오.

myWebView.setWebViewClient(new WebViewClient());

15

코드 에이 두 줄을 추가하십시오-

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());

9

이 메소드 boolean shouldOverrideUrlLoading(WebView view, String url)는 API 24에서 더 이상 사용되지 않습니다. 새 장치를 지원하는 경우을 사용해야합니다 boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

다음과 같이하면 둘 다 사용할 수 있습니다.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
    });
} else {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
}

6

Arulx Z의 대답은 내가 찾던 것과 정확히 일치했습니다.

하이퍼 링크를 클릭하지 않고도 앱 내부에서 웹 탐색을 유지하기 위해 recyclerview 및 webviews가있는 Navigation Drawer로 앱을 작성 중입니다 (따라서 외부 웹 브라우저를 시작하지 않음). 이를 위해 다음 두 줄의 코드를 입력하면 충분합니다.

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

정확히 WebView 문 아래에 있습니다.

구현 된 WebView 코드의 예는 다음과 같습니다.

public class WebView1 extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");
}}

이렇게하면 웹 사이트에서 클릭 한 모든 링크가 WebView에로드됩니다. (모든 SDK가 업데이트 된 상태에서 Android Studio 1.2.2 사용)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.