Android应用启动崩溃:TextView加载失败问题求助
问题背景
我开发的com.bookreader.android应用启动页在Android Studio布局预览正常,但运行时直接崩溃,抛出异常:
FATAL EXCEPTION: main Process: com.bookreader.android, PID: 9970 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bookreader.android/com.bookreader.android.LauncherActivity}: android.view.InflateException: Binary XML file line #17 in com.bookreader.android:layout/activity_launcher: Binary XML file line #17 in com.bookreader.android:layout/activity_launcher: Error inflating class TextView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3676) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813)
移除布局中的TextView后应用可正常运行,更换主题无法解决问题。相关代码如下:
布局文件 activity_launcher.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical"> <ImageView android:id="@+id/app_logo" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" android:layout_gravity="center_horizontal" android:src="@mipmap/ic_launcher" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/app_logo" android:gravity="center" android:text="@string/app_name" android:textColor="@color/colorPrimary" android:textSize="22dp" /> <TextView android:id="@+id/version" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true" android:padding="10dp" android:text="V1.0" android:textColor="#cc000000" /> </RelativeLayout>
LauncherActivity.java
public class LauncherActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_launcher); TextView version = findViewById(R.id.version); version.setText("V" + BuildConfig.VERSION_NAME); } }
使用的主题
<!-- Base application theme. --> <style name="Theme.App" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/color_primary</item> <item name="colorPrimaryVariant">@color/color_primary_variant</item> <item name="colorOnPrimary">@color/white</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/color_secondary</item> <item name="colorSecondaryVariant">@color/color_secondary_variant</item> <item name="colorOnSecondary">@color/black</item> <!-- Status bar color. --> <item name="android:statusBarColor">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> <item name="android:navigationBarColor">@color/white</item> <item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">true</item> </style>
请教问题:
- 该崩溃问题的原因是什么?
- 为何移除TextView后应用正常,更换主题无效?
- 是否是TextView类存在问题?
- 如何解决该问题?
问题解答
崩溃原因:
布局中第一个TextView的textColor引用了@color/colorPrimary,但你的主题里colorPrimary指向的是@color/color_primary(下划线命名),而你并没有定义名为colorPrimary的颜色资源,资源名称不匹配导致XML解析时找不到对应颜色,触发InflateException。移除TextView正常、换主题无效的原因:
- 移除TextView后,布局不再引用那个错误的颜色资源,自然不会触发资源找不到的异常,应用就能正常启动。
- 更换主题没用是因为问题不在主题本身,而是布局里的资源引用和实际存在的资源名称不匹配,主题里的
colorPrimary是属性引用,和你布局里直接写的@color/colorPrimary不是一回事。
TextView类是否有问题:
不是TextView类的问题,它是Android系统标准控件,异常完全是你的资源引用错误导致的。解决方法:
两种可选方案:- 方案一:修改布局中TextView的textColor为主题属性引用:将
android:textColor="@color/colorPrimary"改成android:textColor="?attr/colorPrimary",这样会从当前主题中获取colorPrimary对应的颜色值。 - 方案二:统一资源名称:如果要直接引用颜色资源,要么把布局里的
@color/colorPrimary改成@color/color_primary(和colors.xml里的定义一致),要么在colors.xml中添加<color name="colorPrimary">...</color>的定义。
- 方案一:修改布局中TextView的textColor为主题属性引用:将
内容的提问来源于stack exchange,提问作者user21089755
相关产品推荐
相关产品推荐

