Rob85
Rob85

Reputation: 1729

Webview showing blank screen when clicking a link within the webview

On Android 7.1.1 i have a page on my app that creates a webview and allows some navigation around my site. the first page loads fine, but when i click a link within the webview it shows a white blank page. this all works fine on previous versions of android.

I understand the changes google have made with the webview and chrome is updated and i have been through various resetting and installing of the new webview system app, so i am unsure if the problem is related. I am thinking its not otherwise the first page wouldnt load.

Here is my webview code

 public class WebViewActivity extends Activity
{
Service details;
String URL;
WebView webView;
private DataManager mDataManager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webview);
    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();

    URL = (String)bundle.getString("url");
    webView = (WebView) findViewById(R.id.wv);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.setWebViewClient(new GeoWebViewClient());
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setGeolocationEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.setWebChromeClient(new GeoWebChromeClient());
    webView.clearCache(true);
    webView.loadUrl(URL);


    //webView.setWebViewClient(new Client());
    //webView.setWebChromeClient(new ChromeClient());
    if (Build.VERSION.SDK_INT >= 19) {
        webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    }
    else if(Build.VERSION.SDK_INT >=11 && Build.VERSION.SDK_INT < 19) {
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (webView.canGoBack()) {
                    webView.goBack();
                } else {
                    finish();
                }
                return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}



    /**
     * WebChromeClient subclass handles UI-related calls
     * Note: think chrome as in decoration, not the Chrome browser
     */
    public class GeoWebChromeClient extends WebChromeClient
    {
        @Override
        public void onGeolocationPermissionsShowPrompt(String origin,
                                                       GeolocationPermissions.Callback callback)
        {
            // Always grant permission since the app itself requires location
            // permission and the user has therefore already granted it
            callback.invoke(origin, true, false);
        }
    }

    public class GeoWebViewClient extends WebViewClient
    {


        @Override
        public void onPageFinished(WebView view, String url)
        {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);

        }
        /*@deprecated
        public boolean shouldoverrideurlloading(webview view, string url) {
            return false;
        }*/

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
        {
            view.loadUrl(request.toString());
            return true;
        }
    }

}

I think it may have something to do with shouldOverrideUrlLoading

Upvotes: 0

Views: 2069

Answers (1)

SpiritCrusher
SpiritCrusher

Reputation: 21043

You need to set a WebClient to webView. If you want to open link in webview. Then do like this.

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

for Android N above Use Overridden method :

 @TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

    return false;
}

Upvotes: 1

Related Questions