web_app_to_android_app.txt file created: 2024-02-20 Convert web app to android native app with Android Studio. https://developer.android.com/develop/ui/views/layout/webapps/load-local-content Create WebView which is the whole screen. >Assets folder: create folder "assets" in (we put our website files here): app/src/main/ >Res folder: res folder should already exists if you chose project template with an activity in it. app/src/main/res/ >Local HTML, CSS & JS files (you can create sub-folders like JS, CSS etc.): >Put HTML, CSS and JS files to folder: app/src/main/assets >Put images to: app/src/main/res/drawable >Changes we need to make to HTML file, change CSS and JS file paths to assets folder: >build.gradle.kts should already have some deps, add WebView: implementation("androidx.webkit:webkit:1.8.0") Everything should work as in browser, even custom fonts. Just add fonts folder to assets folder. Below are MainActivity.kt and activity_main.xml files from my test project. ***MainActivity.kt: package com.example.mytest import android.net.Uri import android.os.Bundle import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView import androidx.activity.ComponentActivity import androidx.annotation.RequiresApi import androidx.webkit.WebViewAssetLoader import androidx.webkit.WebViewClientCompat class MainActivity : ComponentActivity() { private lateinit var webView: WebView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) webView = findViewById(R.id.webview) webView.settings.setJavaScriptEnabled(true) val assetLoader = WebViewAssetLoader.Builder() .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this)) .addPathHandler("/res/", WebViewAssetLoader.ResourcesPathHandler(this)) .build() webView.webViewClient = LocalContentWebViewClient(assetLoader) webView.loadUrl("https://appassets.androidplatform.net/assets/index.html") } private class LocalContentWebViewClient(private val assetLoader: WebViewAssetLoader) : WebViewClientCompat() { @RequiresApi(21) override fun shouldInterceptRequest( view: WebView, request: WebResourceRequest ): WebResourceResponse? { return assetLoader.shouldInterceptRequest(request.url) } // To support API < 21. override fun shouldInterceptRequest( view: WebView, url: String ): WebResourceResponse? { return assetLoader.shouldInterceptRequest(Uri.parse(url)) } } } ***activity_main.xml (this file should be in app/src/main/res/layout):