目前,我有一个Android项目,包括1个主项目和多个库项目。
就在最近,我意识到如果主项目和库项目中存在相同的布局文件名,可能会发生不好的事情。
third-party-library-project
- res
- layout
- actionbar_custom_view_done_discard.xml
main-project
- res
- layout
- actionbar_custom_view_done_discard.xml
因此,如果在third-party-library-project
中,如果您的活动中有代码行,
final View customActionBarView = inflater.inflate(
R.layout.actionbar_custom_view_done_discard, null);
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{org.yccheok.jstock.gui/group.pals.android.lib.ui.lockpattern.LockPatternActivity}: android.view.InflateException: Binary XML file line #24: Error inflating class <unknown>
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at group.pals.android.lib.ui.lockpattern.LockPatternActivity.initActionBar(LockPatternActivity.java:356)
at group.pals.android.lib.ui.lockpattern.LockPatternActivity.onCreate(LockPatternActivity.java:347)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
... 11 more
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
... 25 more
Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f010137 a=-1}
at android.content.res.Resources.loadDrawable(Resources.java:1892)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.widget.TextView.<init>(TextView.java:614)
at android.widget.TextView.<init>(TextView.java:442)
... 28 more
如果我将third-party-library-project
中的布局XML文件更改为actionbar_custom_view_done_discard1.xml
,则运行时错误将消失。
如果图书馆项目的数量很少,这不是问题。通过简单的重命名可以轻松解决冲突。然而,当遇到大量的图书馆项目时,有什么是一种强有力的方法或策略来克服这个问题?
答案 0 :(得分:2)
图书馆项目需要确保其资源名称与众不同,并且不会与其他图书馆项目发生冲突,例如通过对这些资源名称应用前缀。
请注意the new Gradle-based build system supports resource subdirectories。我还没有尝试过这个,但如果子目录名称构成资源ID的一部分,那么将资源放在一个独特的子目录中将有助于保持资源ID不同(至少对于非values
资源)。
答案 1 :(得分:1)
首先,我建议您重新命名项目资源文件而不是第一个示例中的第三方文件,因为您可能希望再次从第三方库项目中提取更改。其次,我建议不要使用太多的第三方图书馆项目。根据我的经验,Android构建系统仍然有很多关于图书馆项目的问题。像BuildConfig.DEBUG这样的东西不起作用,我遇到了包含jar文件依赖性的库项目的问题,这些项目依赖性破坏了通过Android检测运行单元测试的能力。还有很多其他的错误,其中大部分都可能相当模糊,但足以解决我不建议使用库项目的问题。