安卓设置Webview的setLayerType方法

3
我正在尝试使用以下代码动态创建一个WebView:
```java WebView webView = new WebView(context); ```
请注意,此代码需要上下文参数。
mWebView = new WebView(this);
mWebView.setId(R.id.webview);
mWebView.setVerticalScrollBarEnabled(false);

mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setWebViewClient(mWebViewClient);
mWebView.setWebChromeClient(mWebChromeClient);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);

但是,当我运行程序时,我的应用程序会强制退出,显示错误信息,说没有名为“setLayerType”的方法。然而,当我通过xml创建Webview时,似乎没有问题:

<WebView android:id="@+id/webview"
    android:scrollbars="none"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layerType="software" />

我在这里使用了“layertype”属性,应用程序运行良好。有人能解释一下这种差异吗?是否没有办法动态设置WebView的层类型?
4个回答

12

虽然这是一个旧问题,但还是要回答一下,以防其他人也遇到同样的问题:

你可以通过反射调用setLayerType方法。这样,代码将独立于操作系统版本而运行。

try {
    Method setLayerTypeMethod = mWebView.getClass().getMethod("setLayerType", new Class[] {int.class, Paint.class});
    setLayerTypeMethod.invoke(mWebView, new Object[] {LAYER_TYPE_SOFTWARE, null});
} catch (NoSuchMethodException e) {
    // Older OS, no HW acceleration anyway
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

它无法独立于操作系统版本成功运行。请参阅原因和无法运行的场景here - DroidDev
它可以在任何操作系统版本上正常运行。如果该方法不存在,则会抛出 NoSuchMethodException 异常并进行捕获。 - Anders Haglund

4

注意:问题“你构建的API级别是什么?”与问题“你所针对的最低API级别是多少?”非常不同。

根据您描述的行为,表明您正在使用API级别>= 11进行构建,并在API级别<11的设备上进行测试。

因为.setLayerType仅从API级别11及以上可用,因此使用API级别>= 11进行构建可以正常构建,但如果您未使用兼容性技巧(如反射或:),则:

Compatibility.getCompatibility().setWebSettingsCache(webSettings);

如果您在API级别<11的设备上测试,会因为该方法不受支持而崩溃。相反,如果您在API级别>= 11的设备上进行测试,应该可以正常工作。


在我苦思冥想并阅读了几个Android页面后,我终于理解了原因,哈哈。但是,感谢您在这里提供清晰的答案。另外,我看到您是Stackoverflow的新成员。欢迎! - Abhijit

3

以下代码在Android 3.0+上可以正常工作,但是当您尝试在android 3.0以下运行此代码时,您的应用程序会被强制关闭。

webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

在 API 11 或以下的版本上,您可以尝试以下代码:

webview.setBackgroundColor(Color.parseColor("#919191"));

或者

你也可以尝试以下的代码,可以在所有API上运行良好。

webview.setBackgroundColor(Color.parseColor("#919191"));
if (Build.VERSION.SDK_INT >= 11) {
    webview.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
}

上述代码对我非常有用。


0

谢谢你的回答!我目前正在构建我的应用程序,以便支持从2.1开始的Android版本。因此,我相信API级别为7。 - Abhijit
由于我正在使用较低的API级别,您认为这没有其他解决办法吗? - Abhijit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接