我已经从Google IO Schedule应用程序源(https://github.com/google/iosched)复制了一个文件
selected_navdrawer_item_background.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/backgroundColor">
<shape>
<solid android:color="#12000000" />
</shape>
</item>
<item android:drawable="?android:selectableItemBackground"/>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
我想用它来突出显示NavigationDrawer中当前选定的项目.我的问题是,当我启动我的应用程序时,它会引发异常.
这是我认为的重要路线.
caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #22:
<item> tag requires a 'drawable' attribute or child tag defining a drawable
Run Code Online (Sandbox Code Playgroud)
第22行是这一行
<item android:drawable="?android:selectableItemBackground"/>
Run Code Online (Sandbox Code Playgroud)
我不知道问题是什么,我从源头复制了它而没有调整它.它在他们的应用程序中运行良好.
我试图改变?android:selectableItemBackground到?attr/selectableItemBackground,但它给了我同样的异常.我似乎无法找到任何其他建议的解决方案.
如果有人知道是什么导致了这一点,请帮助我.
将Dexguard从7.0.12更新到7.1.22后,我在枚举开关上遇到崩溃。
这仅在Dexguard在我们的项目上运行时才会发生(我想这是由Proguard问题引起的)。
如果我使用硬编码值,则不会发生崩溃。
当然,我想避免使用硬编码值。
发生的崩溃如下
java.lang.NoClassDefFoundError: Failed resolution of: Lif;
Run Code Online (Sandbox Code Playgroud)
这发生在陈述的行上switch(type) {(见下文)
应用程序崩溃的一些示例代码(假设MyEnum是课程的Enum):
MyEnum type = MyEnum.SomeValue;
switch (type) {
case SomeValue:
// Do something
Log.i("Tag", "Hello world!");
break;
}
Run Code Online (Sandbox Code Playgroud)
假设的序数值MyEnum.SomeValue为1。
如果我更改case SomeValue:为case 1:预期的效果。
我不知道为什么会发生此崩溃。我试图添加这些Proguard规则。
-keep enum * { *; }
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
但这不能解决问题。
我刚刚检查了映射文件,所有枚举名称都保留了。现在,我对所发生的事情一无所知。
my.identifier.MyEnum -> my.identifier.MyEnum:
my.identifier.MyEnum SomeValue -> SomeValue
my.identifier.MyEnum[] $VALUES -> $VALUES
6:6:my.identifier.MyEnum[] …Run Code Online (Sandbox Code Playgroud)