У меня есть кнопка с эффектом пульсации, и я хотел бы добавить селектор состояния для цвета фона, когда кнопка включена / отключена.
state_selector.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>
ripple.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
может кто-нибудь помочь разобраться в проблеме? Благодарность
23. Ripple поддерживается.
Я нашел проблему.
Рябь нуждается в доступном ресурсе.
Селектор состояний, который я использовал, не предоставлял возможности рисования для каждого состояния, а скорее предоставлял цвет для каждого состояния. И поэтому он рушился.
Следующий 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>
Я думаю, что ответ @Sunny работает хорошо.
Это предложение может быть излишним, но вы также можете объединить рябь и селектор в один 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>
Добавьте его в свойство фона кнопки или в файл styles.xml.
<style name = "buttonRound" parent = "Base.Widget.AppCompat.Button">
<item name = "android:background">@drawable/button_transparent_background</item>
</style>
Спасибо за развернутый ответ!
Наконец-то появилась версия, которая работает. Второй элемент под элементом селектора заставил его работать. Спасибо!
какой у тебя минимальный SDK?