Fehty
Fehty

Reputation: 11

WebView go back

WebView can go back, forward and reload on virtual device. When I test it on real device back and forward doesn't work.As for reload it works fine. I know the same question was asked but i didn't find solution for my example.

class Site : android.support.v4.app.Fragment(), OnBackPressedListener {

    var changeU: String = "https://www.google.ru/search?client=opera&q=google&sourceid=opera&ie=UTF-8&oe=UTF-8"

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.site, container, false)
    }

    override fun onSaveInstanceState(outState: Bundle) {
            super.onSaveInstanceState(outState)
            webView.saveState(outState)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            setHasOptionsMenu(true)
            webView.settings.javaScriptEnabled = true
            webView.settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
            if (savedInstanceState == null) {
                    webView.loadUrl(changeU)
            }
            webView.settings.setSupportZoom(true)
            webView.settings.builtInZoomControls = true
            webView.settings.displayZoomControls = false
            webView.webViewClient = MyWebViewClient()
            super.onViewCreated(view, savedInstanceState)
    }

    private inner class MyWebViewClient : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                    view.loadUrl(url)
                    return true
            }
    }

    override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
            inflater!!.inflate(R.menu.site_menu, menu)
            super.onCreateOptionsMenu(menu, inflater)
    }


    override fun onOptionsItemSelected(item: MenuItem): Boolean {
            when (item.itemId) {
                    R.id.backT -> {
                            if (webView.canGoBack()) {
                                    webView.goBack()
                            } else {
                            }
                            return true
                    }
                    R.id.reloadT -> {
                            webView.reload()
                            return true
                    }
                    R.id.forwardT -> {
                            if (webView.canGoForward()) {
                                    webView.goForward()
                            }
                            return true
                    }
                    else -> return super.onOptionsItemSelected(item)
            }
    }

    override fun onBackPressed() {
            if (webView.canGoBack()) {
                    webView.goBack()
            } else {
            }
    }
}

I suppose it's so simple mistake but i can't solve it.

Upvotes: 1

Views: 1420

Answers (1)

Pankaj Kant Patel
Pankaj Kant Patel

Reputation: 2060

Android WebView new tab action urls can be handled by extending WebChromeClient.

Please take a look for activity class

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.webkit.*
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private val changeU: String = "https://www.google.ru/search?client=opera&q=google&sourceid=opera&ie=UTF-8&oe=UTF-8"


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        webView.settings.javaScriptEnabled = true
        webView.settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
        webView.settings.setSupportZoom(true)
        webView.settings.builtInZoomControls = true
        webView.settings.displayZoomControls = false
        // add multi window support
        webView.settings.javaScriptCanOpenWindowsAutomatically = true
        webView.webViewClient = MyWebViewClient()
        webView.webChromeClient = MyWebChromeClient()

        if (savedInstanceState == null) {
            webView.loadUrl(changeU)
        }

    }

    private inner class MyWebChromeClient : WebChromeClient() {
        // handle new tab action urls if required
        override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {
            super.onShowCustomView(view, callback)
        }
    }

    private inner class MyWebViewClient : WebViewClient() {
        override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
            view.loadUrl(url)
            return true
        }

        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            return super.shouldOverrideUrlLoading(view, request)
        }
    }
    override fun onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack()
        } else {
        }
    }
}

Upvotes: 1

Related Questions