Reputation: 11
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
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