Android开发:PhotoEditorView布局加载失败问题求助
我正在开发一款使用PhotoEditor库的Android应用,已按照官方文档的入门和视图设置步骤操作,但包含PhotoEditorView的UI XML布局无法加载。以下是相关代码与报错信息:
XML布局代码
<?xml version="1.0" encoding="utf-8"?> <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="@android:color/transparent"> <ja.burhanrashid52.photoeditor.PhotoEditorView android:id="@+id/photoEditorView" android:layout_width="match_parent" android:layout_height="match_parent" > </ja.burhanrashid52.photoeditor.PhotoEditorView> </RelativeLayout>
Fragment代码
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment try { final View view = inflater.inflate(R.layout.app_fragment_edit_picture, container, false); } catch (Exception e) { LogHelper.LogError("TEST"); } return null; }
注:添加try-catch并返回null仅用于测试。
报错信息
Binary XML file line #9: Binary XML file line #9: Error inflating class ja.burhanrashid52.photoeditor.PhotoEditorView
完整堆栈跟踪:
android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class ja.burhanrashid52.photoeditor.PhotoEditorView at android.view.LayoutInflater.inflate(LayoutInflater.java:539) at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at com.mobileop.app.gui.fragments.EditPictureFragment.onCreateView(EditPictureFragment.java:54) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411) at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273) at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273) at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229) at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2466) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1483) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411) at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5551) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class ja.burhanrashid52.photoeditor.PhotoEditorView at android.view.LayoutInflater.createView(LayoutInflater.java:645) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) at android.view.LayoutInflater.inflate(LayoutInflater.java:515) ... 30 more Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at android.view.LayoutInflater.createView(LayoutInflater.java:619) ... 35 more Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lja/burhanrashid52/photoeditor/R$styleable; at ja.burhanrashid52.photoeditor.PhotoEditorView.init(PhotoEditorView.java:72) at ja.burhanrashid52.photoeditor.PhotoEditorView.(PhotoEditorView.java:48) ... 37 more Caused by: java.lang.ClassNotFoundException: Didn't find class "ja.burhanrashid52.photoeditor.R$styleable" on path: DexPathList[[zip file "/data/app/com.mobileop-1/base.apk"],nativeLibraryDirectories=[/data/app/com.mobileop-1/lib/arm, /vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) ... 39 more Suppressed: java.lang.ClassNotFoundException: ja.burhanrashid52.photoeditor.R$styleable at java.lang.Class.classForName(Native Method) at java.lang.BootClassLoader.findClass(ClassLoader.java:781) at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) at java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 40 more Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
从你的报错堆栈里一眼就能看到核心问题:java.lang.NoClassDefFoundError: Failed resolution of: Lja/burhanrashid52/photoeditor/R$styleable;,简单说就是PhotoEditor库的资源类没被正确引入或者编译到你的项目里。我给你整理几个针对性的解决步骤,按顺序试下来应该能搞定:
1. 先确认依赖是不是加对了
打开你Module级的build.gradle文件,检查是否正确添加了PhotoEditor的依赖,而且版本要和你的项目兼容:
dependencies { // 如果你用的是Android Support库,用1.x版本 implementation 'ja.burhanrashid52:photoeditor:1.0.1' // 要是已经迁移到AndroidX,就用2.x版本 // implementation 'ja.burhanrashid52:photoeditor:2.0.0' }
加完之后一定要点Sync Now,等同步完成,确保没有同步错误提示。
2. 清理重建项目,清缓存
Android Studio有时候会抽风,缓存的旧编译文件会导致资源类找不到。按这个步骤来:
- 顶部菜单栏点
Build > Clean Project - 然后点
Build > Rebuild Project - 实在不行就重启Android Studio,再运行项目
3. 如果你开了Multidex,检查配置
如果你的项目启用了Multidex,要确保库的类被正确打包进主Dex:
- 先在Module的
build.gradle里确认Multidex是开着的:android { defaultConfig { multiDexEnabled true } } dependencies { implementation 'com.android.support:multidex:1.0.3' // AndroidX的话用这个:implementation 'androidx.multidex:multidex:2.0.1' } - 然后自定义一个Application类(没有的话就新建),继承
MultiDexApplication:public class MyApp extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } - 最后在
AndroidManifest.xml里指定这个Application:<application android:name=".MyApp" ...> </application>
4. 把Fragment里的测试代码改回来
你现在的Fragment捕获异常后直接返回null,这会导致视图根本加载不出来,测试完之后改回正常逻辑,顺便把异常日志打全,方便后续排查:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { try { return inflater.inflate(R.layout.app_fragment_edit_picture, container, false); } catch (Exception e) { LogHelper.LogError("Inflate layout failed: ", e); // 打印完整异常栈 return super.onCreateView(inflater, container, savedInstanceState); } }
按上面的步骤逐一排查,应该就能解决PhotoEditorView的Inflate错误了。
内容的提问来源于stack exchange,提问作者Yusril Maulidan Raji

