【问题标题】:ripple drawable crashes the app on Android API 19波纹可绘制在 Android API 19 上使应用程序崩溃
【发布时间】:2016-12-13 07:54:10
【问题描述】:

我正在使用自定义波纹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) 

我应该怎么做才能防止崩溃?

【问题讨论】:

    标签: android rippledrawable android-api-levels


    【解决方案1】:

    RippleDrawable 是在 API 21 中添加的,因此在早期的 SDK 中不可用。

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

    【讨论】:

    • 在 21 日之前有没有其他方法可以做到这一点
    【解决方案2】:

    我遇到了同样的问题。

    Mina Samy's 的回答也解决了我的问题。

    Atef Hares 要求在旧版本中提供替代方案。 对我有用的是使用选择器而不是波纹

    例如:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2018-03-14
        • 2018-07-04
        相关资源
        最近更新 更多