Android setLayerType Webview - PullRequest
       7

Android setLayerType Webview

2 голосов
/ 16 октября 2011

Я пытаюсь создать 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',Однако, когда я создаю Webview через xml, кажется, что нет никаких проблем:

<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 голосов
/ 22 июня 2012

Старый вопрос, но, в любом случае, отвечая, если кто-то найдет его:

Вы можете вызвать 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();
}
3 голосов
/ 19 января 2012

ПРИМЕЧАНИЕ: вопрос "для какого уровня API вы строите?"ОЧЕНЬ отличается от вопроса «какой минимальный уровень API вы нацеливаете?».

Учитывая поведение, которое вы описали, он предполагает, что вы строите с уровнем API> = 11 и тестируете на устройстве, котороеуровень API <11. </p>

Поскольку .setLayerType доступен только с уровня API 11 и выше, сборка с уровнем API> = 11 будет работать нормально, но если вы не используете приемы совместимости, такие как отражение или: Compatibility.getCompatibility() .setWebSettingsCache (webSettings);... тогда при тестировании на устройстве с уровнем API <11 вы получите сбой, потому что этот метод не поддерживается.С другой стороны, если вы тестируете на устройстве с уровнем API> = 11, вы обнаружите, что оно работает.

2 голосов
/ 16 мая 2013

код ниже работает нормально Android 3.0 + , но когда вы попробуете этот код ниже Android 3.0 , тогда ваше приложение принудительно закроется.

webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

Вы попробуете ниже код на вашем менее чем 1008 * 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 голосов
/ 16 октября 2011

Для какого уровня API вы создаете? выглядит как .setLayerType (int, Paint) был представлен на API lvl 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...