Java Android:如何在WebView中加载html字符串?

Java Android:如何在WebView中加载html字符串?,java,android,html,xml,webview,Java,Android,Html,Xml,Webview,我在android应用程序的布局文件中有一个webview,我想加载一个包含html和javascript的视频。我想用来加载视频的html字符串是: video= '<div id="15518031408206776"><script type="text/JavaScript" src="https://www.aparat.com/embed/gJ8jm?data[rnddiv]=15518031408206776&data[responsive]=yes"&g

我在android应用程序的布局文件中有一个webview,我想加载一个包含html和javascript的视频。我想用来加载视频的html字符串是:

video= '<div id="15518031408206776"><script type="text/JavaScript" src="https://www.aparat.com/embed/gJ8jm?data[rnddiv]=15518031408206776&data[responsive]=yes"></script></div>'
但是webview只显示纯文本html代码而不是视频

我怎样才能解决这个问题

更新:


我通过使用Html.fromHtml(视频)解码我的Html字符串解决了这个问题!现在,它开始工作,WebView显示视频。

尝试使用
加载数据(字符串数据、字符串mimeType、字符串编码)
,使用“text/html”mime类型和“UTF-8”编码


另外,您应该使用
标记来包装html内容,这样您将拥有一个有效的html文档,而不仅仅是一个有效的文档片段。

尝试使用
加载数据(字符串数据、字符串mimeType、字符串编码)
替换为“text/html”mime类型和“UTF-8”编码


此外,您应该使用
标记包装html内容,这样您就可以拥有一个有效的html文档,而不仅仅是一个有效的文档片段。

尝试向webview添加以下属性

    WebView webview = (WebView) findViewById(R.id.webView1);
    webview.setWebViewClient(new WebViewClient());
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webview.getSettings().setPluginState(WebSettings.PluginState.ON);
    webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
    webview.setWebChromeClient(new WebChromeClient());
    webview.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);

还可以将
android:hardwareAccelerated=“true”
添加到清单文件中的
应用程序
标记

尝试将以下属性添加到webview

    WebView webview = (WebView) findViewById(R.id.webView1);
    webview.setWebViewClient(new WebViewClient());
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webview.getSettings().setPluginState(WebSettings.PluginState.ON);
    webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
    webview.setWebChromeClient(new WebChromeClient());
    webview.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);
还将
android:hardwareAccelerated=“true”
添加到清单文件中的
应用程序
标记中。 创建这样的适配器方法

  @JvmStatic
@BindingAdapter("htmlString")
fun loadHTML(view: WebView, htmlString: String) {
    if(htmlString.isEmpty()){
        return
    }

    try{
        view.webChromeClient = WebChromeClient()
        view.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(view, url)
            }
            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
                return false
            }
        }

        view.loadData(htmlString, "text/html", "UTF-8")
    }catch (ex: Exception){
        A35Log.e(TAG, "Error loading html string")
    }
}
 <WebView
    android:id="@+id/wvHtml"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    bind:htmlString="@{viewModel.infoModel.hTML}"
    />
然后像这样在xml代码中使用它

  @JvmStatic
@BindingAdapter("htmlString")
fun loadHTML(view: WebView, htmlString: String) {
    if(htmlString.isEmpty()){
        return
    }

    try{
        view.webChromeClient = WebChromeClient()
        view.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(view, url)
            }
            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
                return false
            }
        }

        view.loadData(htmlString, "text/html", "UTF-8")
    }catch (ex: Exception){
        A35Log.e(TAG, "Error loading html string")
    }
}
 <WebView
    android:id="@+id/wvHtml"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    bind:htmlString="@{viewModel.infoModel.hTML}"
    />

如果您不使用数据绑定,只想使用代码,那么只需从适配器示例中获取代码,并将其直接加载到webview中即可。然而,数据绑定和适配器是保持代码干净和小的非常好的方法

最后,在pie中,默认情况下停止允许加载http流量(清除流量)。因此,如果由于任何原因无法加载,您可能必须添加到应用程序标记中,以允许加载不安全的html。我不确定加载您自己的HTML字符串是否算作“不安全”,但可能是这样

 <application
    ...
   android:usesCleartextTraffic="true">

</application>

简单。 创建这样的适配器方法

  @JvmStatic
@BindingAdapter("htmlString")
fun loadHTML(view: WebView, htmlString: String) {
    if(htmlString.isEmpty()){
        return
    }

    try{
        view.webChromeClient = WebChromeClient()
        view.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(view, url)
            }
            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
                return false
            }
        }

        view.loadData(htmlString, "text/html", "UTF-8")
    }catch (ex: Exception){
        A35Log.e(TAG, "Error loading html string")
    }
}
 <WebView
    android:id="@+id/wvHtml"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    bind:htmlString="@{viewModel.infoModel.hTML}"
    />
然后像这样在xml代码中使用它

  @JvmStatic
@BindingAdapter("htmlString")
fun loadHTML(view: WebView, htmlString: String) {
    if(htmlString.isEmpty()){
        return
    }

    try{
        view.webChromeClient = WebChromeClient()
        view.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(view, url)
            }
            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
                return false
            }
        }

        view.loadData(htmlString, "text/html", "UTF-8")
    }catch (ex: Exception){
        A35Log.e(TAG, "Error loading html string")
    }
}
 <WebView
    android:id="@+id/wvHtml"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    bind:htmlString="@{viewModel.infoModel.hTML}"
    />

如果您不使用数据绑定,只想使用代码,那么只需从适配器示例中获取代码,并将其直接加载到webview中即可。然而,数据绑定和适配器是保持代码干净和小的非常好的方法

最后,在pie中,默认情况下停止允许加载http流量(清除流量)。因此,如果由于任何原因无法加载,您可能必须添加到应用程序标记中,以允许加载不安全的html。我不确定加载您自己的HTML字符串是否算作“不安全”,但可能是这样

 <application
    ...
   android:usesCleartextTraffic="true">

</application>


感谢您的方法,但根据Android文档:“如果您的目标API级别>=14,则默认情况下启用硬件加速…”并且将Android:hardwareAccelerated=“true”添加到清单文件中的应用程序标记并没有解决我的问题!我通过使用Html.fromHtml(视频)解码我的Html字符串解决了这个问题!现在它工作了,WebView显示了视频。感谢您的方法,但根据Android文档:“如果您的目标API级别>=14,则默认情况下启用硬件加速…”并且在清单文件中将Android:hardwareAccelerated=“true”添加到应用程序标记中并没有解决我的问题!我通过使用Html.fromHtml(视频)解码我的Html字符串解决了这个问题!现在它工作了,网络视图显示了视频。我通过使用Html.fromHtml(视频)解码我的Html字符串解决了这个问题!现在它工作了,网络视图显示了视频。我用html.fromHtml(视频)来解码我的html字符串,解决了这个问题!现在它工作了,网络视图显示了视频。而且不需要使用完整的html标记。