自定义AndroidX Preference预览报错:ClassNotFoundException问题求助
自定义SwitchPreferenceCompat预览时ClassNotFoundException问题
在Android Studio Giraffe | 2022.3.1 Beta 2(运行时版本17.0.6+0-b2043.56-9884540 amd64)中,预览settings.xml时出现报错,提示找不到com.mypackage.preferences.SwitchPreferenceCompatFix类,但该类实际已存在于项目中。
错误栈信息
java.lang.ClassNotFoundException: com.mypackage.preferences.SwitchPreferenceCompatFix not found. at com.android.tools.idea.rendering.LayoutlibCallbackImpl.findClass(LayoutlibCallbackImpl.java:836) at com.android.layoutlib.bridge.android.BridgeContext$1.findClass(BridgeContext.java:642) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467) at androidx.preference.PreferenceInflater.createItem(PreferenceInflater.java:218) at androidx.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:281) at androidx.preference.PreferenceInflater.rInflate(PreferenceInflater.java:349) at androidx.preference.PreferenceInflater.rInflate(PreferenceInflater.java:351) at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:161) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at com.android.layoutlib.common.util.ReflectionUtils.invoke(ReflectionUtils.java:80) at com.android.layoutlib.bridge.android.support.SupportPreferencesUtil.createInflatedPreference(SupportPreferencesUtil.java:106) at com.android.layoutlib.bridge.android.support.SupportPreferencesUtil.inflatePreference(SupportPreferencesUtil.java:285) at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:351) at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:450) at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:122) at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:701) at com.android.tools.idea.rendering.RenderTask.lambda$inflate$8(RenderTask.java:848) at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$3.run(RenderExecutor.kt:200) at com.android.tools.idea.rendering.RenderExecutor$PriorityRunnable.run(RenderExecutor.kt:298) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833)
相关代码
settings.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="root"> <PreferenceCategory android:key="cat_main" android:title="@string/pref_settings"> <com.mypackage.preferences.SwitchPreferenceCompatFix android:icon="@drawable/ic_pref" android:key="prefKey" android:title="@string/pref_title" android:defaultValue="true" android:summary="@string/pref_sum"/> </PreferenceCategory> </androidx.preference.PreferenceScreen>
SwitchPreferenceCompatFix.java
package com.mypackage.preferences; import android.content.Context; import androidx.preference.PreferenceViewHolder; import androidx.preference.SwitchPreferenceCompat; import android.util.AttributeSet; import com.mypackage.R; public class SwitchPreferenceCompatFix extends SwitchPreferenceCompat { private final Context context; public SwitchPreferenceCompatFix(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); this.context = context; } public SwitchPreferenceCompatFix(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; } public SwitchPreferenceCompatFix(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public SwitchPreferenceCompatFix(Context context) { super(context); this.context = context; } @Override public void onBindViewHolder(PreferenceViewHolder holder) { holder.itemView.setPadding((int) context.getResources().getDimension(R.dimen.preference_side_padding), 0, (int) context.getResources().getDimension(R.dimen.preference_side_padding), 0); super.onBindViewHolder(holder); } }
排查与解决方案
- 清理重建项目:执行
Build > Clean Project,然后Build > Rebuild Project,清除编译缓存,确保类被正确编译到预览可用的目录中。 - 清理IDE缓存并重启:通过
File > Invalidate Caches... > Invalidate and Restart操作,解决Android Studio缓存导致的类加载异常。 - 验证包名与XML引用一致性:确认
SwitchPreferenceCompatFix的包名com.mypackage.preferences与XML中的引用完全一致,无拼写错误。 - 检查预览SDK版本:确保布局预览窗口选择的SDK版本与项目
compileSdkVersion一致,避免API版本差异引发的类加载问题。 - 确认依赖配置:检查项目
build.gradle中是否正确添加了androidx.preference相关依赖,且版本与项目编译版本适配。 - 检查类访问修饰符:确保
SwitchPreferenceCompatFix是public类,避免包私有访问导致预览引擎无法加载。 - 切换渲染模式:在布局预览窗口右上角尝试切换
Show System UI选项,或更换预览设备,排查渲染引擎的兼容性问题。
内容的提问来源于stack exchange,提问作者Trancer
相关产品推荐
相关产品推荐

