MainActivity.kt
package com.cfsuman.kotlintutorials
import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Button
import android.widget.ProgressBar
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
class MainActivity : Activity() {
lateinit var webView:WebView
private val url = "https://www.android--code.com"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Get the widgets references from XML layout
webView = findViewById(R.id.webView)
val buttonLoad: Button = findViewById(R.id.buttonLoad)
val buttonBack: Button = findViewById(R.id.buttonBack)
val buttonForward: Button = findViewById(R.id.buttonForward)
val progressBar: ProgressBar = findViewById(R.id.progressBar)
// Get the web view settings instance
val settings = webView.settings
// Enable java script in web view
settings.javaScriptEnabled = true
// Enable and setup web view cache
//settings.setAppCacheEnabled(true)
settings.cacheMode = WebSettings.LOAD_DEFAULT
//settings.setAppCachePath(cacheDir.path)
// Enable zooming in web view
settings.setSupportZoom(true)
settings.builtInZoomControls = true
settings.displayZoomControls = true
// Zoom web view text
settings.textZoom = 110
// Enable disable images in web view
settings.blockNetworkImage = false
// Whether the WebView should load image resources
settings.loadsImagesAutomatically = true
// More web view settings
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
settings.safeBrowsingEnabled = true // api 26
}
//settings.pluginState = WebSettings.PluginState.ON
settings.useWideViewPort = true
settings.loadWithOverviewMode = true
settings.javaScriptCanOpenWindowsAutomatically = true
settings.mediaPlaybackRequiresUserGesture = false
// More optional settings, you can enable it by yourself
settings.domStorageEnabled = true
settings.setSupportMultipleWindows(true)
settings.loadWithOverviewMode = true
settings.allowContentAccess = true
settings.setGeolocationEnabled(true)
settings.allowUniversalAccessFromFileURLs = true
settings.allowFileAccess = true
// WebView settings
webView.fitsSystemWindows = true
// Activate hardware acceleration
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)
// Set web view client
webView.webViewClient = object: WebViewClient(){
override fun onPageStarted(view: WebView, url: String,
favicon: Bitmap?) {
// Page loading started
// Do something
toast("Page loading.")
// Enable disable back forward button
buttonBack.isEnabled = webView.canGoBack()
buttonForward.isEnabled = webView.canGoForward()
}
override fun onPageFinished(view: WebView, url: String) {
// Page loading finished
// Display the loaded page title in a toast message
toast("Page loaded: ${view.title}")
// Enable disable back forward button
buttonBack.isEnabled = webView.canGoBack()
buttonForward.isEnabled = webView.canGoForward()
}
}
// Set web view chrome client
webView.webChromeClient = object: WebChromeClient(){
override fun onProgressChanged(
view: WebView, newProgress: Int) {
progressBar.progress = newProgress
}
}
// Load button click listener
buttonLoad.setOnClickListener{
// Load url in a web view
webView.loadUrl(url)
}
// Back button click listener
buttonBack.setOnClickListener{
if(webView.canGoBack()){
// Go to back history
webView.goBack()
}
}
// Forward button click listener
buttonForward.setOnClickListener{
if(webView.canGoForward()){
// Go to forward history
webView.goForward()
}
}
}
// Method to show app exit dialog
private fun showAppExitDialog() {
val builder = AlertDialog.Builder(this)
builder.setTitle("Please confirm")
builder.setMessage("No back history found," +
" want to exit the app?")
builder.setCancelable(true)
builder.setPositiveButton("Yes") { _, _ ->
// Do something when user want to exit the app
// Let allow the system to handle
// the event, such as exit the app
super@MainActivity.onBackPressed()
}
builder.setNegativeButton("No") { _, _ ->
// Do something when want to stay in the app
toast("thank you.")
}
// Create the alert dialog using alert dialog builder
val dialog = builder.create()
// Finally, display the dialog when user press back button
dialog.show()
}
// Handle back button press in web view
override fun onBackPressed() {
if (webView.canGoBack()) {
// If web view have back history,
// then go to the web view back history
webView.goBack()
toast("Going to back history")
} else {
// Ask the user to exit the app or stay in here
showAppExitDialog()
}
}
}
// Extension function to show toast message
fun Context.toast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rootLayout"
android:background="#DCDCDC">
<ProgressBar
android:id="@+id/progressBar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/buttonLoad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="Load URL"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/progressBar" />
<Button
android:id="@+id/buttonBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="Back"
app:layout_constraintBottom_toBottomOf="@+id/buttonLoad"
app:layout_constraintStart_toEndOf="@+id/buttonLoad" />
<Button
android:id="@+id/buttonForward"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="Forward"
app:layout_constraintBottom_toBottomOf="@+id/buttonBack"
app:layout_constraintStart_toEndOf="@+id/buttonBack" />
<WebView
android:id="@+id/webView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/buttonLoad" />
</androidx.constraintlayout.widget.ConstraintLayout>