纹理可绘制对象在Android API 19上导致应用程序崩溃。

8

我正在使用自定义的涟漪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

如何避免应用程序崩溃?

3个回答

20

RippleDrawable是在API 21中添加的,因此无法在早期版本的SDK上使用。

您可以将可绘制文件移动到res/drawable-v21目录下,以确保它不会在早期版本中崩溃。


3
有没有其他在 21 年之前完成这个任务的替代方法? - Atef Hares

13

我也曾遇到同样的问题。

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>

2

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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接