创建TabLayout时触发java.lang.NullPointerException渲染异常求助
TabLayout渲染空指针问题解决方法
创建TabLayout时遇到设计预览渲染失败,刷新布局也无法解决,抛出NullPointerException,相关信息如下:
布局XML代码
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.google.android.material.tabs.TabLayout android:id="@+id/tabLayout" android:layout_width="409dp" android:layout_height="wrap_content" android:layout_marginTop="335dp" app:tabSelectedTextColor="@color/white" app:tabTextColor = "@color/black" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <com.google.android.material.tabs.TabItem android:id="@+id/Chatsid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Chats" /> <com.google.android.material.tabs.TabItem android:id="@+id/tabStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Status" /> <com.google.android.material.tabs.TabItem android:id="@+id/Callid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calls" /> </com.google.android.material.tabs.TabLayout> </androidx.constraintlayout.widget.ConstraintLayout>
堆栈跟踪信息
java.lang.NullPointerException at android.content.res.Resources_Theme_Delegate.obtainStyledAttributes(Resources_Theme_Delegate.java:74) at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java:1631) at android.content.Context.obtainStyledAttributes(Context.java:874) at android.widget.TextView.setTextAppearance(TextView.java:3965) at androidx.appcompat.widget.AppCompatTextView.setTextAppearance(AppCompatTextView.java:216) at com.google.android.material.textview.MaterialTextView.setTextAppearance(MaterialTextView.java:106) at android.widget.TextView.setTextAppearance(TextView.java:3954) at androidx.core.widget.TextViewCompat.setTextAppearance(TextViewCompat.java:289) at com.google.android.material.tabs.TabLayout$TabView.updateTab(TabLayout.java:2772) at com.google.android.material.tabs.TabLayout$TabView.update(TabLayout.java:2801) at com.google.android.material.tabs.TabLayout$TabView.setTab(TabLayout.java:2713) at com.google.android.material.tabs.TabLayout.createTabView(TabLayout.java:1673) at com.google.android.material.tabs.TabLayout.newTab(TabLayout.java:956) at com.google.android.material.tabs.TabLayout.addTabFromItemView(TabLayout.java:824) at com.google.android.material.tabs.TabLayout.addViewInternal(TabLayout.java:1730) at com.google.android.material.tabs.TabLayout.addView(TabLayout.java:1720) at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:1131) at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:72) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1101) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088) at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:1130) at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:72) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1101) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088) at android.view.LayoutInflater.inflate(LayoutInflater.java:686) at android.view.LayoutInflater.inflate(LayoutInflater.java:505)
Manifest文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.TabLayout" tools:targetApi="33"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> </application> </manifest>
Build.Gradle文件
plugins { id 'com.android.application' } android { namespace 'com.example.tablayout' compileSdk 33 defaultConfig { applicationId "com.example.tablayout" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }
问题原因
从堆栈跟踪可以看出,空指针出现在TextView.setTextAppearance方法中,结合Manifest里配置的@style/Theme.TabLayout主题,大概率是该主题没有正确继承Material Components主题,导致TabLayout渲染时无法获取必要的样式资源,进而触发空指针异常。
解决步骤
修复主题继承关系
打开res/values/styles.xml(或对应的主题文件),确保Theme.TabLayout继承自MaterialComponents系列主题,示例如下:<style name="Theme.TabLayout" parent="Theme.MaterialComponents.Light.DarkActionBar"> <!-- 可根据需求自定义颜色等属性 --> <item name="colorPrimary">@color/primary_color</item> <item name="colorPrimaryVariant">@color/primary_variant_color</item> <item name="colorOnPrimary">@color/white</item> </style>修正TabLayout宽度设置
布局中TabLayout的android:layout_width="409dp"是固定值,会导致不同设备适配问题,建议修改为match_parent:<com.google.android.material.tabs.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" <!-- 替换固定宽度 --> android:layout_height="wrap_content" ... />清理缓存并重启
点击Android Studio菜单栏的File -> Invalidate Caches...,选择Invalidate and Restart,清理IDE缓存后重新构建项目。
完成以上操作后,重新打开布局预览即可正常渲染TabLayout。
内容的提问来源于stack exchange,提问作者shiga123
相关产品推荐
相关产品推荐

