代码之家  ›  专栏  ›  技术社区  ›  Sunny

Android:后台带有Ripple和状态选择器的按钮:资源未找到异常

  •  0
  • Sunny  · 技术社区  · 8 年前

    我有一个具有涟漪效果的按钮,希望在启用/禁用该按钮时为背景色添加一个状态选择器。

    状态选择器.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:color="@color/green" android:state_enabled="true"/>
    
        <item android:color="@color/grey" android:state_enabled="false"/>
    
    </selector>
    

    涟漪.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:colorControlHighlight"> 
        <item android:id="@android:id/mask" android:drawable="@android:color/white" />
    
        <item android:id="@android:id/background" android:drawable="@drawable/state_selector" />
    
    </ripple>
    

    Button.xml:

    <Button
            android:background="@drawable/ripple"
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
             />
    

    但是应用程序在呈现以下内容时崩溃:

    Resources$NotFoundException: Drawable drawable/ripple with resource ID #0x7f070071
         Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ripple.xml from drawable resource ID #0x7f070071
    

    和

    android.content.res.Resources$NotFoundException: Drawable drawable/state_selector with resource ID #0x7f070075
         Caused by: android.content.res.Resources$NotFoundException: File res/drawable/state_selector.xml from drawable resource ID #0x7f070075
    

    有人能帮忙解决这个问题吗? 谢谢

    2 回复  |  直到 8 年前
        1
  •  2
  •   Carmen Scholte Lubberink    7 年前

    我认为桑尼的回答很有效。

    这个建议可能有点过头了,但是您也可以将ripple和选择器组合成一个这样的xml文件。这是一个圆形透明按钮,具有波纹和启用和禁用状态。

    button_transparent_background.xml按钮

    <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/white">
    
        <item>
            <selector>
                <item android:state_enabled="true">
                    <shape xmlns:android="http://schemas.android.com/apk/res/android"
                        android:shape="rectangle">
                        <corners android:radius="100dp" />
                        <solid android:color="@color/transparent" />
                        <stroke
                            android:width="1dp"
                            android:color="@color/white" />
                    </shape>
                </item>
    
                <item android:state_enabled="false">
                    <shape xmlns:android="http://schemas.android.com/apk/res/android"
                        android:shape="rectangle">
                        <corners android:radius="100dp" />
                        <solid android:color="@color/transparent" />
                        <stroke
                            android:width="1dp"
                            android:color="@color/whiteTransparent" />
                    </shape>
                </item>
            </selector>
        </item>
    
        <item
            android:id="@android:id/mask"
            android:state_pressed="true">
            <shape xmlns:android="http://schemas.android.com/apk/res/android"
                android:shape="rectangle">
                <corners android:radius="100dp" />
                <solid android:color="@color/white" />
                <stroke
                    android:width="1dp"
                    android:color="@color/white" />
            </shape>
        </item>
    
    </ripple>
    

    将其添加到按钮的background属性或styles.xml

    <style name="buttonRound" parent="Base.Widget.AppCompat.Button">
            <item name="android:background">@drawable/button_transparent_background</item>
    </style>
    
        2
  •  0
  •   Sunny    8 年前

    我发现了问题。

    涟漪需要一个可提取的资源。

    我使用的状态选择器并没有为每个状态提供drawable,而是为每个状态提供了一种颜色。所以它就崩溃了。

    下面的状态选择器xml可以解决这个问题。其他一切都一样。

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:drawable="@color/green" android:state_enabled="true"/>
    
        <item android:drawable="@color/grey" android:state_enabled="false"/>
    
    </selector>