ripple drawable 在 Android API 19 上使应用程序崩溃
ripple drawable crashes the app on Android API 19
我正在使用自定义波纹drawable
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_shortAnimTime"
android:color="@android:color/white">
<item android:id="@android:id/mask">
<shape android:shape="rectangle" >
<solid android:color="@android:color/white" />
</shape>
</item>
</ripple>
但它在 API 19
时使应用程序崩溃
android.content.res.Resources$NotFoundException: File res / drawable /
ripple_effect_square2.xml from drawable resource ID #0x7f02017d
at android.content.res.Resources.loadDrawable(Resources.java:2101)
at android.content.res.Resources.getDrawable(Resources.java:700)
at android.view.View.setBackgroundResource(View.java:15303)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line # 2: invalid drawable tag ripple
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java: 933)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java: 877)
at android.content.res.Resources.loadDrawable(Resources.java: 2097)
at android.content.res.Resources.getDrawable(Resources.java: 700)
at android.view.View.setBackgroundResource(View.java: 15303)
我应该怎么做才能防止崩溃?
RippleDrawable 是在 API 21 中添加的,因此在早期的 SDK 中不可用。
您可以将可绘制文件移动到 res/drawable-v21 以确保它不会在早期版本中崩溃。
我遇到了同样的问题。
Mina Samy的回答也解决了我的问题。
Atef Hares 要求旧版本的替代方案。
对我有用的是使用选择器而不是 ripple
例如:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#ccffffff" />
</shape>
</item>
<item android:state_focused="true">
<shape android:shape="rectangle">
<stroke android:color="@android:color/white" />
</shape>
</item>
<item android:drawable="@color/playColor" />
</selector>
其中
<color name="playColor">#E8EAF6</color>
Ripple 仅适用于 Lollipop (Android API 21)。这是一个向后兼容的示例,其中包括状态但没有默认背景(透明):
创建两个同名的drawable xml
文件,一个放在drawable-v21
文件夹中,另一个放在普通的drawable
文件夹中。
drawable-v21/ripple_red_solid.xml
:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@android:color/red">
<item android:id="@android:id/mask">
<color android:color="@android:color/red" />
</item>
<item>
<selector>
<item android:state_selected="true">
<color android:color="@android:color/red" />
</item>
<item android:state_activated="true">
<color android:color="@android:color/red" />
</item>
<item android:state_focused="true">
<color android:color="@android:color/red" />
</item>
</selector>
</item>
</ripple>
drawable/ripple_red_solid.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape android:shape="rectangle">
<solid android:color="@android:color/red" />
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@android:color/red" />
</shape>
</item>
<item android:state_focused="true">
<shape android:shape="rectangle">
<solid android:color="@android:color/red" />
</shape>
</item>
</selector>
然后简单地在视图上使用它,例如:
<LinearLayout
...
android:background="@drawable/ripple_red_solid" />
我正在使用自定义波纹drawable
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_shortAnimTime"
android:color="@android:color/white">
<item android:id="@android:id/mask">
<shape android:shape="rectangle" >
<solid android:color="@android:color/white" />
</shape>
</item>
</ripple>
但它在 API 19
时使应用程序崩溃android.content.res.Resources$NotFoundException: File res / drawable /
ripple_effect_square2.xml from drawable resource ID #0x7f02017d
at android.content.res.Resources.loadDrawable(Resources.java:2101)
at android.content.res.Resources.getDrawable(Resources.java:700)
at android.view.View.setBackgroundResource(View.java:15303)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line # 2: invalid drawable tag ripple
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java: 933)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java: 877)
at android.content.res.Resources.loadDrawable(Resources.java: 2097)
at android.content.res.Resources.getDrawable(Resources.java: 700)
at android.view.View.setBackgroundResource(View.java: 15303)
我应该怎么做才能防止崩溃?
RippleDrawable 是在 API 21 中添加的,因此在早期的 SDK 中不可用。
您可以将可绘制文件移动到 res/drawable-v21 以确保它不会在早期版本中崩溃。
我遇到了同样的问题。
Mina Samy的回答也解决了我的问题。
Atef Hares 要求旧版本的替代方案。 对我有用的是使用选择器而不是 ripple
例如:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#ccffffff" />
</shape>
</item>
<item android:state_focused="true">
<shape android:shape="rectangle">
<stroke android:color="@android:color/white" />
</shape>
</item>
<item android:drawable="@color/playColor" />
</selector>
其中
<color name="playColor">#E8EAF6</color>
Ripple 仅适用于 Lollipop (Android API 21)。这是一个向后兼容的示例,其中包括状态但没有默认背景(透明):
创建两个同名的drawable xml
文件,一个放在drawable-v21
文件夹中,另一个放在普通的drawable
文件夹中。
drawable-v21/ripple_red_solid.xml
:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@android:color/red">
<item android:id="@android:id/mask">
<color android:color="@android:color/red" />
</item>
<item>
<selector>
<item android:state_selected="true">
<color android:color="@android:color/red" />
</item>
<item android:state_activated="true">
<color android:color="@android:color/red" />
</item>
<item android:state_focused="true">
<color android:color="@android:color/red" />
</item>
</selector>
</item>
</ripple>
drawable/ripple_red_solid.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape android:shape="rectangle">
<solid android:color="@android:color/red" />
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@android:color/red" />
</shape>
</item>
<item android:state_focused="true">
<shape android:shape="rectangle">
<solid android:color="@android:color/red" />
</shape>
</item>
</selector>
然后简单地在视图上使用它,例如:
<LinearLayout
...
android:background="@drawable/ripple_red_solid" />