【问题标题】:How to load an URL inside a WebView using Android Kotlin?如何使用 Android Kotlin 在 WebView 中加载 URL?
【发布时间】:2018-06-01 00:13:26
【问题描述】:

我是 Android 和 Kotlin 的新手。

谁能帮我在webView 中加载一个网址?

我只想在应用打开时加载 URL 并查看网页。

【问题讨论】:

    标签: android webview kotlin


    【解决方案1】:

    1.activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.kotlinwebview.MainActivity">
    
    
    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp" />
        
    </android.support.constraint.ConstraintLayout>
    

    2.MainActivity.kt

    class MainActivity : AppCompatActivity() {
    
        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)
    
            webView.webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    view?.loadUrl(url)
                    return true
                }
            }
            webView.loadUrl("https://www.google.co.in/")
        }
    }
    

    【讨论】:

    • 如何在kotlin中启用javascript??
    • webView.getSettings().setJavaScriptEnabled(true);
    • 我认为在 Kotlin 中正确的做法是通过:webView!!.settings.javaScriptEnabled = true
    • 如果您使用的是 Kotlin Android 扩展。 webview.settings.javaScriptEnabled = true
    • if (url != null) { view?.loadUrl(url) }
    【解决方案2】:

    这是在 android webView 中加载网站的完整工作代码。只需从 android studio 创建一个新项目并使用以下代码加载 web 视图。只需更改要在 Web 视图中加载的 URL。

    • 它将在 web 视图中加载一个网站
    • 它将检查互联网连接的可用性
    • 如果没有互联网,请用户从小吃店消息中启用 WiFi
    • 加载进度,直到网站加载
    • 在加载网站时出现问题时处理错误
    • 处理后退按钮按下案例
    • 使用 toast 处理退出应用程序确认

    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"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/rootView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <TextView
            android:id="@+id/infoTV"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    MainActivity.kt:

    import android.annotation.SuppressLint
    import android.content.Context
    import android.content.Intent
    import android.graphics.Bitmap
    import android.net.ConnectivityManager
    import android.net.NetworkCapabilities
    import android.os.Bundle
    import android.os.Handler
    import android.os.Looper
    import android.provider.Settings
    import android.util.Log
    import android.view.KeyEvent
    import android.webkit.WebResourceError
    import android.webkit.WebResourceRequest
    import android.webkit.WebView
    import android.webkit.WebViewClient
    import android.widget.Toast
    import androidx.appcompat.app.AppCompatActivity
    import com.google.android.material.snackbar.Snackbar
    import kotlinx.android.synthetic.main.activity_main.*
    
    
    class MainActivity : AppCompatActivity() {
    
        private var progress: Progress? = null
        private var isLoaded: Boolean = false
        private var doubleBackToExitPressedOnce = false
        private var webURL = "https://www.geeklabs.co.in/" // Change it with your URL
    
        @SuppressLint("SetJavaScriptEnabled")
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            webView.settings.javaScriptEnabled = true
            if (!isOnline()) {
                showToast(getString(R.string.no_internet))
                infoTV.text = getString(R.string.no_internet)
                showNoNetSnackBar()
                return
            }
        }
    
        override fun onResume() {
            if (isOnline() && !isLoaded) loadWebView()
            super.onResume()
        }
    
        private fun loadWebView() {
            infoTV.text = ""
            webView.loadUrl(webURL)
            webView.webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                    val url = request?.url.toString()
                    view?.loadUrl(url)
                    return super.shouldOverrideUrlLoading(view, request)
                }
    
                override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                    setProgressDialogVisibility(true)
                    super.onPageStarted(view, url, favicon)
                }
    
                override fun onPageFinished(view: WebView?, url: String?) {
                    isLoaded = true
                    setProgressDialogVisibility(false)
                    super.onPageFinished(view, url)
                }
    
                override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) {
                    isLoaded = false
                    val errorMessage = "Got Error! $error"
                    showToast(errorMessage)
                    infoTV.text = errorMessage
                    setProgressDialogVisibility(false)
                    super.onReceivedError(view, request, error)
                }
            }
        }
    
        override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
            if (event.action == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    if (webView.canGoBack()) {
                        webView.goBack()
                    } else {
                        showToastToExit()
                    }
                    return true
                }
            }
            return super.onKeyDown(keyCode, event)
        }
    
        private fun showToastToExit() {
            when {
                doubleBackToExitPressedOnce -> {
                    onBackPressed()
                }
                else -> {
                    doubleBackToExitPressedOnce = true
                    showToast(getString(R.string.back_again_to_exit))
                    Handler(Looper.myLooper()!!).postDelayed({ doubleBackToExitPressedOnce = false }, 2000)
                }
            }
        }
    
        private fun setProgressDialogVisibility(visible: Boolean) {
            if (visible) progress = Progress(this, R.string.please_wait, cancelable = true)
            progress?.apply { if (visible) show() else dismiss() }
        }
    
        private fun isOnline(): Boolean {
            val connectivityManager =
                    getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val capabilities =
                    connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
            if (capabilities != null) {
                when {
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                        Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
                        return true
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                        Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
                        return true
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
                        Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
                        return true
                    }
                }
            }
            return false
        }
    
        private fun showToast(message: String) {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
        }
    
        private fun showNoNetSnackBar() {
            val snack = Snackbar.make(rootView, getString(R.string.no_internet), Snackbar.LENGTH_INDEFINITE)
            snack.setAction(getString(R.string.settings)) {
                startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
            }
            snack.show()
        }
    }
    

    Progress.kt:

    import android.app.AlertDialog
    import android.app.Dialog
    import android.content.Context
    import android.view.LayoutInflater
    import android.view.View
    import android.widget.TextView
    import androidx.annotation.StringRes
    
    class Progress constructor(
        context: Context?,
        @StringRes private val titleRes: Int,
        cancelable: Boolean = false
    ) {
    
        private var view: View? = null
        private var builder: AlertDialog.Builder
        private var dialog: Dialog
    
        init {
            view = LayoutInflater.from(context).inflate(R.layout.progress, null)
            view?.findViewById<TextView>(R.id.text)?.setText(titleRes)
            builder = AlertDialog.Builder(context)
            builder.setView(view)
            dialog = builder.create()
            dialog.setCancelable(cancelable)
        }
    
        fun setProgressMessage(@StringRes titleRes: Int) {
            view?.findViewById<TextView>(R.id.text)?.setText(titleRes)
        }
    
        fun show() {
            dialog.show()
        }
    
        fun dismiss() {
            if (dialog.isShowing) {
                dialog.dismiss()
            }
        }
    
        fun setProgressDialogVisibility(isVisible: Boolean) {
    
        }
    }
    

    pregress.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">
    
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="16dp" />
    
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="@style/TextAppearance.AppCompat.SearchResult.Subtitle"
            tools:text="Loading" />
    
    </LinearLayout>
    

    Manifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.geeklabs.webviewkotlin">
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
        <application
            android:allowBackup="true"
            android:fullBackupContent="false"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    strings.xml:

    <resources>
        <string name="app_name">WebViewKotlin</string>
        <string name="please_wait">Please wait&#8230;</string>
        <string name="no_internet">No internet connection!</string>
        <string name="settings">Settings</string>
        <string name="back_again_to_exit">Please click BACK again to exit</string>
    </resources>
    

    build.gradle:

    apply plugin: 'com.android.application'
    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    
    android {
        compileSdkVersion 30
        buildToolsVersion "30.0.0"
    
        defaultConfig {
            applicationId "com.geeklabs.webviewkotlin"
            minSdkVersion 23
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: "libs", include: ["*.jar"])
        implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        implementation 'androidx.core:core-ktx:1.3.1'
        implementation 'androidx.appcompat:appcompat:1.1.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        implementation 'com.google.android.material:material:1.1.0'
        testImplementation 'junit:junit:4.13'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    
    }
    

    这是 Git 中心的完整工作代码。 Click here to navigate to Git Hub

    【讨论】:

    • 如何在我的 android studio 上使用您的 GitHub 项目,而无需手动复制/粘贴所有文件,谢谢
    • 您需要克隆存储库并从android studio打开它。
    【解决方案3】:

    将此添加到您的活动中:

    @SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        setContentView(R.layout.activity_webview)
    
        val mWebView = findViewById<WebView>(R.id.webview)
    
        val webSettings = mWebView.settings
        webSettings.javaScriptEnabled = true
        mWebView.loadUrl(getString(R.string.website_url))
        mWebView.webViewClient = HelloWebViewClient()
        WebView.setWebContentsDebuggingEnabled(false)
    
    }
    

    并将以下内容添加到 HelloWebViewClient() 类中,以允许后退按钮导航和出站外部链接:

        override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
            if (Uri.parse(url).host == getString(R.string.website_domain)) {
                return false
            }
            val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
            startActivity(intent)
            return true
        }
    
        override fun onPageFinished(view: WebView, url: String) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url)
        }
    
    }
    
    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) {
            webview.goBack()
            return true
        }
        return super.onKeyDown(keyCode, event)
    }
    

    添加定义website_domain (https://stackoverflow.com/) 和website_host (stackoverflow.com) 的字符串。

    如果您为了实现您的目标而遇到困难,请尝试this full sample 并按照说明进行操作,因为您只需要编辑您网站的 URL 和干净的域名。

    【讨论】:

    • 如何开启摄像头访问权限?
    • 我猜你需要实时请求权限。你试过了吗,@Tiago?
    • 在 chrome 浏览器上能用吗?只在WebView 不能用?
    • 看,我不确定以下解决方案是否足够,但这里至少有几个可能的解决方法:oneanother。但是,我不确定它们是否有效,因为我从未测试过在WebView 上实现权限。无论如何,希望它对您有所帮助!
    • 另外,@Tiago,我建议您直接提出问题来解释您的问题并显示您的实际代码片段,以便其他人可以更准确地帮助您。
    【解决方案4】:

    使用 Android Kotlin 扩展插件。如果您使用的是 Android Studio 3.0 及更高版本,请不要担心。已安装在您的项目中。

    在布局中使用WebView的id并调用loadUrl()方法。

    Android WebView Example - Kotlin & Java

    这里的 WebView id : webview

    webview.loadUrl("https://www.androidride.com")

    别忘了添加

    <uses-permission android:name="android.permission.INTERNET"/>
    

    如果您的第三方浏览器使用 WebView 中加载的任何 URL 打开,则提供 WebViewClient。

    webview.webViewClient = WebViewClient()
    

    如果您想在 WebView 中播放 youtube 视频,则必须在 WebView 中启用 JavaScript。

    webview.settings.javaScriptEnabled = true

    如果你是 Android 应用开发的初学者,那么本教程将帮助你解开你对 WebView 的几乎所有疑惑。

    click here

    【讨论】:

    • 如何开启摄像头访问权限?
    • 可怕的网站也发送某人,它非常无组织。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2015-04-14
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多