После миграции на Android X вылетает приложение android.view.InflateException - PullRequest
1 голос
/ 18 марта 2019

После миграции приложение на Android X приложение вылетало во время выполнения.Это происходит, когда активность фрагмента раздувает макет.Моя StackTrace:

Процесс: com.sizestream.android, PID: 17380 java.lang.RuntimeException: Невозможно возобновить действие {package / ... Activity}: android.view.InflateException: BinaryСтрока XML-файла # 50: Строка двоичного XML-файла # 50: Ошибка надувания класса в android.app.ActivityThread.performResumeActivity (ActivityThread.java:3581) в android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3621) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2862) на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1589) на android.os.Handler.dispatchMessage (Handler.java:106) в android.os.Looper.loop (Looper.java:164) в android.app.ActivityThread.main (ActivityThread.java:6494) в java.lang.reflect.Method.invoke (роднойMethod) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:438) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807) Вызывается: android.view.InflateException: строка двоичного файла XML № 50: строка двоичного файла XML № 50: ошибка раздувания класса. Вызвано: android.view.InflateException: строка двоичного файла XML # 50: ошибка раздувания класса. Вызвано: java.lang.reflect.InvocationTargetException в java.lang.reflect.Constructor.newInstance0 (собственный метод) в java.lang.reflect.Constructor.newInstance (Constructor.java:334) в android.view.LayoutInflater.createView (LayoutInflater.java:647 at).view.(LayoutInflater.java:824) в android.view.LayoutInflater.rInflate (LayoutInflater.java:866) в android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:824) в android.view.LayoutInflater.inflate (LayoutInflater.inflate (LayoutInflater.inflate (LayoutInflater.inflate)515) на android.view.LayoutInflater.inflate (LayoutInflater.java:423) на androidx.databinding.DataBindingUtil.inflate (DataBindingUtil.java:126) в androidx.databinding.DataBindingUtil.inflate (DataBindingUtil.java:95) в com.common.mvvm.BaseFragment.onCreateView (BaseFragment.kt: 43) в androidx.fragment.app.фрагмента.fragment.app.agerImpl.java:1721) в androidx.fragment.app.FragmentController.execPendingActions (FragmentController.java:447) в androidx.fragment.app.FragmentActivity.onResume (FragmentActivity.java:444) в android.app.Instrumentation.RumeActivity.java: 1355) на android.app.Activity.performResume (Activity.java:7117) на android.app.ActivityThread.performResumeActivity (ActivityThread.java:3556)на android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3621) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2862) на android.app.ActivityThread.-wrap11 (неизвестный источник: 0) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1589) на android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:164) на android.app.ActivityThread.main(ActivityThread.java:6494) 2019-03-18 13: 05: 21.536 17380-17380 / com.sizestream.android E / AndroidRuntime: в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:438) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)

1 Ответ

3 голосов
/ 18 марта 2019

После некоторой отладки я обнаружил, что проблема возникает, когда проект использовал material-components-android перед миграцией, и некоторые действия необходимо выполнить вручную:

  1. TextInputLayout дочернее представление должно быть com.google.android.material.textfield.TextInputEditText вместо EditText или AppCompatEditText:

    <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/input_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/edit_text"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
    

  2. TextInputLayout должен использовать android: theme и app: errorTextAppearance унаследовано от Widget.MaterialComponents.TextInputLayout.FilledBox

styles.xml:

<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
    ...
</style>
<style name="TextInputLayoutErrorAppearance" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
    ...
</style>

layout.xml

<com.google.android.material.textfield.TextInputLayout
                android:id="@+id/input_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:theme="@style/TextInputLayoutStyle"
                app:errorEnabled="true"
                app:errorTextAppearance="@style/TextInputLayoutErrorAppearance">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/edit_text"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>

Если у вас есть переключатель типа ввода пароля app: passwordToggleEnabled и app: passwordToggleTint необходимо заменить на app: endIconMode = "password_toggle"

<com.google.android.material.textfield.TextInputLayout
                android:id="@+id/password_input_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:errorEnabled="true"
                app:endIconMode="password_toggle">


            <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/password_edit_text"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPassword"/>

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