Kotlin: загрузка локальных HTML JS в Android WebView - PullRequest
0 голосов
/ 26 сентября 2019

Итак, у меня есть реактивный проект, но я решил отказаться от него, по той же причине, по которой airbnb перешел на собственную разработку (java / kotlin).Большую часть моего опыта я использую в Интернете, так что никаких мобильных нативных впечатлений, кроме hello world, смеется.Теперь я хочу использовать kotlin и хотел спасти большую часть моего кода, загрузив весь его в WebView, а затем, возможно, построить более естественным образом после того, как я получу больше знаний.(вероятно, 1 компонент WebView на действие / экран).И мне, вероятно, нужно преобразовать свой реагирующий нативный код в реагирующий веб, но я думаю, что я это понял.

Моя задача - вызывать / ссылаться на собственные возможности (например, камера, локальное хранилище) в js для вызовафункция kotlin или что-то в этом роде, но я думаю, что есть способы сделать это, но я не видел такого примера в kotlin, поэтому я изо всех сил.

Резюме:

  • загружать локальные html / js файлы в WebView

  • собственные функции вызова / доступа (например, камера, локальное хранилище) из WebView

до настоящего времени.. activity_main.xml

 <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_toTopOf="parent" />

MainActivity.kt

package com.example.kotlinwebview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

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

        webView.settings.javaScriptEnabled = true
        webView.settings.setSupportZoom(false)

        webView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
            }
        }
    }
}

app / src / main / assets / test.js

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width; user-scalable=0;" />
<title>JavaScript Interface</title>
</head>
<body>
    <h1>This is HTML</h1>

    <script language="javascript">
       function someFunction() {
           ...
       }

       function someFunction2() {
           ...
       }

       function callFromActivity(msg){
           ...
       }
    </script>

</body>
</html>

Было бы круто, есливы, ребята, можете помочь мне с первым.

1 Ответ

0 голосов
/ 26 сентября 2019
class MainActivity : AppCompatActivity() {

    // this is globar variable
    val FILECHOOSER_RESULTCODE = 1001
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        webView.settings.javaScriptEnabled = true
        webView.settings.setSupportZoom(false)

        webView.webChromeClient = object : WebChromeClient() {

            override fun onShowFileChooser(
                webView: WebView,
                filePathCallback: ValueCallback<Array<Uri>>,
                fileChooserParams: FileChooserParams
            ): Boolean {

                val contentSelectionIntent = Intent(Intent.ACTION_GET_CONTENT)
                contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE)
                contentSelectionIntent.type = "*/*"
                val intentArray: Array<Intent?> = arrayOfNulls(0)

                val chooserIntent = Intent(Intent.ACTION_CHOOSER)
                chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent)
                chooserIntent.putExtra(Intent.EXTRA_TITLE, "File Chooser")
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray)
                startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE)
                return true
            }
        }
    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == FILECHOOSER_RESULTCODE) {

            val result = if (intent == null || resultCode != RESULT_OK) null else data?.data
            result?.let {
                val uriArray: Array<Uri> = arrayOf(it)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...