Android setLayerType Webview

时间:2011-10-16 00:50:08

标签: android android-layout android-webview

我正在尝试使用以下代码动态创建WebView:

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 个答案:

答案 0 :(得分:12)

老问题,但无论如何都要回答其他人找到它:

您可以通过反射调用setLayerType。这样代码将独立于OS版本运行。

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();
}

答案 1 :(得分:3)

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

根据您所描述的行为,它建议您使用api级别&gt; = 11构建并在api级别<11的设备上进行测试。

因为.setLayerType仅从api级别11开始提供,所以使用api级别&gt; = 11构建将构建正常,但如果您不使用反射或兼容性等兼容性技巧: Compatibility.getCompatibility()setWebSettingsCache(webSettings)。 ...然后当您在api级别<11的设备上进行测试时,您将遇到崩溃,因为该方法不受支持。另一方面,如果您在api级别&gt; = 11的设备上进行测试,您会发现它有效。

答案 2 :(得分:2)

下面的代码可以正常运行 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);
}

以上代码对我来说是完整的。

答案 3 :(得分:0)

您要为什么API级别构建?看起来.setLayerType(int, Paint)似乎是在api 11级引入的。