将应用程序迁移到 Android X 应用程序后在运行时崩溃。当 Fragment 的 Activity 膨胀布局时会发生这种情况。我的堆栈跟踪是:
进程:com.sizestream.android,PID:17380 java.lang.RuntimeException:无法恢复活动 {package/...Activity}:android.view.InflateException:二进制 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(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os。 Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang。com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 处的reflect.Method.invoke(Native Method) 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 at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:334) at android.view.LayoutInflater.createView(LayoutInflater.java:647)在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790) 在 android.view.LayoutInflater。createViewFromTag(LayoutInflater.java:730) at android.view.LayoutInflater.rInflate(LayoutInflater.java:863) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) at android.view.LayoutInflater.rInflate(LayoutInflater.java) :866) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:515) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:423) 在 androidx .databinding.DataBindingUtil.inflate(DataBindingUtil.java:126) at androidx.databinding.DataBindingUtil.inflate(DataBindingUtil.java:95) at com.common.mvvm.BaseFragment.onCreateView(BaseFragment.kt:43) at androidx.fragment。 app.Fragment.performCreateView(Fragment.java:2530) 在 androidx。fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:887) at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1233) at androidx.fragment.app.FragmentManagerImpl.moveToandroidImpl.java:887(Fragment) .fragment.app.BackStackRecord.executeOps(BackStackRecord.java:688) 在 androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2069) 在 androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager8) androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1814) at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1721) at androidx.fragment.app.FragmentControllerexecPendingActions(FragmentController.java:447) at androidx.fragment.app.FragmentActivity.onResume(FragmentActivity.java:444) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1355) at 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(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at 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: at java.lang.reflect.Method.invoke(Native Method) at com. android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
经过一些调试后,我发现项目在迁移之前使用了material-components-android时会出现问题,并且某些事情必须手动完成:
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"/>
Run Code Online (Sandbox Code Playgroud)
TextInputLayout应该使用从Widget.MaterialComponents.TextInputLayout.FilledBox继承的android:theme和app: errorTextAppearance
样式.xml:
<style name="TextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
...
</style>
<style name="TextInputLayoutErrorAppearance" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
...
</style>
Run Code Online (Sandbox Code Playgroud)
布局文件
<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>
Run Code Online (Sandbox Code Playgroud)
如果您有密码输入类型的切换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"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1248 次 |
| 最近记录: |