WebView InflateException

时间:2019-09-04 07:45:35

标签: java android android-webview

在“活动”中,我添加了Webview(没有异常):

<WebView
        tools:context=".Activities.WebViewActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView"/>

在我的WebViewActivity中,我声明了它:

webview = findViewById(R.id.webView);
webview.setWebViewClient(new AppWebViewClients());
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebChromeClient(new WebChromeClient());
webview.getSettings().setDefaultTextEncodingName("utf-8");

问题是我的应用在某些android设备上崩溃了(在Crashlytics中看到了)...我在模拟器上重现了这种情况,并获得了此日志(第一部分):

java.lang.RuntimeException: Unable to start activity ComponentInfo{jamhome.ru.lktsj/ru.domyland.superdom.Activities.WebViewActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class android.webkit.WebView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我找到了很好的解决方案-创建Class并使用它代替基本的Webview:

public class LollipopFixedWebView extends WebView {

    public LollipopFixedWebView(Context context) {
        super(getFixedContext(context));
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs) {
        super(getFixedContext(context), attrs);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(getFixedContext(context), attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(getFixedContext(context), attrs, defStyleAttr, defStyleRes);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
        super(getFixedContext(context), attrs, defStyleAttr, privateBrowsing);
    }

    public static Context getFixedContext(Context context) {
        return context.createConfigurationContext(new Configuration());
    }
}

好吧,不再崩溃,很好,但是:我在html中加载了包含Select标记的页面,如果单击,它将无法正常工作!基本上,Android必须使用Select的变量打开系统对话框,但这不是...

有什么想法吗??

2 个答案:

答案 0 :(得分:0)

简单地做-:

更改

<WebView
        tools:context=".Activities.WebViewActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView"/>

至-:

<yourpackgename.LollipopFixedWebView
        tools:context=".Activities.WebViewActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webView"/>

也更改Java文件

LollipopFixedWebView webview=findViewById(R.id.webview);

答案 1 :(得分:0)

HERE中查看我的问题

简而言之:仅在默认Context导致Context的操作系统版本上使用固定的InflateException

private static Context getFixedContext(Context context) {
    if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) // Android Lollipop 5.0 & 5.1
        return context.createConfigurationContext(new Configuration());
    return context;
}