Combine StateListDrawable and LevelListDrawable - android

Is there a way to combine the effects of a StateListDrawable and a LevelListDrawable?
I wrote this resource file but when used nothing appear:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<selector
android:constantSize="true"
android:variablePadding="false"
android:maxLevel="0"
>
<item android:state_pressed="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_shade_pressed" />
</layer-list>
</item>
<item android:state_focused="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_shade_selected" />
</layer-list>
</item>
<item>
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_shade_normal" />
</layer-list>
</item>
</selector>
<selector
android:constantSize="true"
android:variablePadding="false"
android:maxLevel="1"
>
<item android:state_pressed="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_lighted" />
<item android:drawable="#drawable/btu_shade_pressed" />
</layer-list>
</item>
<item android:state_focused="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_lighted" />
<item android:drawable="#drawable/btu_shade_selected" />
</layer-list>
</item>
<item>
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_lighted" />
<item android:drawable="#drawable/btu_shade_normal" />
</layer-list>
</item>
</selector>
</level-list>
Then I call
_btn.getBackground().setLevel(level); //level is either 0 or 1
to change the level of the drawable (_btn is a button btw).
Why it doesn't work?
Thanks in advance.

Found myself the solution: <selector> elements must be enclosed in <item> elements:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:maxLevel="0"
>
<selector
android:constantSize="true"
android:variablePadding="false"
>
<item android:state_pressed="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_shade_pressed" />
</layer-list>
</item>
<item android:state_focused="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_shade_selected" />
</layer-list>
</item>
<item>
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_shade_normal" />
</layer-list>
</item>
</selector>
</item>
<item
android:maxLevel="1"
>
<selector
android:constantSize="true"
android:variablePadding="false"
>
<item android:state_pressed="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_lighted" />
<item android:drawable="#drawable/btu_shade_pressed" />
</layer-list>
</item>
<item android:state_focused="true">
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_lighted" />
<item android:drawable="#drawable/btu_shade_selected" />
</layer-list>
</item>
<item>
<layer-list>
<item android:drawable="#drawable/btu_color_standard" />
<item android:drawable="#drawable/btu_lighted" />
<item android:drawable="#drawable/btu_shade_normal" />
</layer-list>
</item>
</selector>
</item>
</level-list>

In my case, the problem was I did not set the button to use the background in the level-list. For example, if you have the level-list defined in res/drawable/button_levels.xml, then you need to set the button background as "#drawable/button_levels".

Related

How to make a Custom Button with XML Files?

Since I followed a Video from "Coding in Flow", I did everything (Link: https://www.youtube.com/watch?v=Z1w3y0saKjY)
And of course, I like to add Custom Buttons into my Game. But the Problem is, that the View shows still the standard button or doesn't even like me (that won't even show in preview). And my laptop doesn't have that much space available, then I can't run on AVD Device. And I'll do the first tests on my 25% development completion.
Still, nothing. This is the code (all 5 codes including styles.xml):
<?xml version="1.0" encoding="utf-8"?>
<!--button_default.xml-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="0"
android:endColor="#2D0D0D"
android:startColor="#7E0707" />
<padding
android:bottom="8dp"
android:left="8dp"
android:right="8dp"
android:top="8dp" />
<stroke
android:width="2dp"
android:color="#4E2828" />
<corners android:radius="15dp" />
</shape>
<!--button_pressed.xml-->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="0"
android:endColor="#543838"
android:startColor="#CA7676" />
<padding
android:bottom="8dp"
android:left="8dp"
android:right="8dp"
android:top="8dp" />
<stroke
android:width="2dp"
android:color="#4E2828" />
<corners android:radius="15dp" />
</shape>
<!--button_disabled.xml-->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#989898" />
<padding
android:bottom="8dp"
android:left="8dp"
android:right="8dp"
android:top="8dp" />
<stroke
android:width="2dp"
android:color="#191919" />
<corners android:radius="15dp" />
</shape>
<!--custom_button.xml-->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/button_pressed" android:state_pressed="true" />
<item android:state_enabled="false" android:drawable="#drawable/button_disabled" />
<item android:drawable="#drawable/button_default" />
</selector>
<!--styles.xml-->
<resources>
<style name="AppTheme" parent="#android:style/Theme.Material.Light.DarkActionBar">
<item name="android:colorPrimary">#color/colorPrimary</item>
<item name="android:colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="android:colorAccent">#color/colorAccent</item>
<item name="android:colorControlHighlight">#color/colorControlHighlight</item>
<item name="android:colorControlNormal">#color/colorControlNormal</item>
<item name="buttonStyle">#style/CustomButton</item>
</style>
<style name="FullScreen" parent="#android:style/Theme.Material.Light.NoActionBar.Fullscreen">
<item name="android:colorPrimary">#color/colorPrimary</item>
<item name="android:colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="android:colorAccent">#color/colorAccent</item>
<item name="android:colorControlHighlight">#color/colorControlHighlight</item>
<item name="android:colorControlNormal">#color/colorControlNormal</item>
<item name="buttonStyle">#style/CustomButton</item>
</style>
<style name="NoActionBar" parent="#android:style/Theme.Material.Light.NoActionBar">
<item name="android:colorPrimary">#color/colorPrimary</item>
<item name="android:colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="android:colorAccent">#color/colorAccent</item>
<item name="android:colorControlHighlight">#color/colorControlHighlight</item>
<item name="android:colorControlNormal">#color/colorControlNormal</item>
<item name="buttonStyle">#style/CustomButton</item>
</style>
<style name="NoStatusBar" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
<item name="buttonStyle">#style/CustomButton</item>
</style>
<style name="CustomButton" parent="Widget.AppCompat.Button">
<item name="android:background">#drawable/custom_button</item>
<item name="android:textColor">#FFF</item>
</style>
</resources>
I hope for any answer. It could be the case of "AndroidX" thing.

Button with background and shape doesn't have a press effect

I can't figure out why my buttons doesn't have the press effect.
i guess my styles is the problem.
The button is displayed inside a fragment hosted by AppCombatActivity
v21 style.xml is
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyTheme" parent="MyTheme.Base">
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">#android:transition/move</item>
<item name="android:windowSharedElementExitTransition">#android:transition/move</item>
</style>
</resources>
style.xml is
<style name="MyTheme" parent="MyTheme.Base">
</style>
<style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Your customizations go here -->
<item name="buttonStyle">#style/LoginButton</item>
<!-- Override the color of UI controls -->
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:textColorSecondary">#color/white</item>
<item name="android:textColorPrimary">#color/white</item>
<item name="colorPrimary">#color/my_blue</item>
<item name="colorPrimaryDark">#color/my_blue</item>
<item name="colorAccent">#color/my_purple</item>
</style>
<style name="LoginButton" parent="Widget.AppCompat.Button.Colored">
<item name="android:textAllCaps">false</item>
<item name="colorControlHighlight">#color/my_purple</item>
<item name="android:textColor">#color/white</item>
</style>
button code:
<Button
android:theme="#style/LoginButton"
android:background="#drawable/roundedbutton_do_this"
android:backgroundTint="#color/dark_blue"
android:id="#+id/SelectDateButton"
android:layout_width="match_parent"
android:layout_height="52dp"
android:gravity="center"
android:text="#string/ChooseDateTime_SelectDate"
android:layout_margin="12dp"
android:singleLine="false"
android:layout_gravity="center_vertical" />
background code:
<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#color/green"/>
<corners android:radius="10dp" />
</shape>
minSdkVersion:16
targetSdkVersion:27
Now i don't see any effect on the button when i press it. test it on android 6 and 7
EDIT: i have try this but the buttons dont have shape (rounded corners)
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:drawable="#color/green" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="#drawable/gradient" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="#drawable/gradient" />
<item android:drawable="#color/green" />
<item>
<shape android:shape="rectangle">
<solid android:color="#color/green"/>
<corners android:radius="10dp" />
</shape>
</item>
</selector>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="#dimen/_3sdp"
app:cardBackgroundColor="#android:color/white">
You can use selector as background drawable, refer to this answer.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:drawable="#color/green" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="#color/ANY_OTHER" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="#color/ANY_OTHER" />
<item android:drawable="#color/green" />
</selector>
I have manage to create a press effect with rounded corners that fades on click this way:
selector.xml
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="#android:integer/config_shortAnimTime">
<item android:state_focused="true" android:state_pressed="false" android:drawable="#drawable/colorbutton" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="#drawable/gradient" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="#drawable/gradient" />
<item android:drawable="#drawable/colorbutton" />
</selector>
gradient.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="10dp" />
<gradient android:angle="90" android:startColor="#880f0f10" android:centerColor="#880d0d0f" android:endColor="#885d5d5e"/>
</shape>
</item>
</layer-list>
colorbutton.xml
<?xml version="1.0" encoding="utf-8" ?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#color/green"/>
<corners android:radius="10dp" />
</shape>
and on button i set:
<Button
android:background="#drawable/selector" />
thanks #Omkar for the help.

Style file to add border to all buttons?

How can I make a style file that adds borders to all buttons? All buttons already have a background image.
Create your style in file res/values/styles.xml
<style name="KeyBoardButton">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center</item>
<item name="android:layout_margin">4dp</item>
<item name="android:paddingTop">8dp</item>
<item name="android:paddingBottom">8dp</item>
<item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
<item name="android:textColor">#555</item>
<item name="android:background">#drawable/button_border</item>
</style>
Define the border that will be used in file res/drawable/button_border.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="4dp"/>
<solid
android:color="#d5cbc6" />
<stroke
android:width="2dp"
android:color="#dedede" />
</shape>
</item>
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="4dp"/>
<solid
android:color="#f9f9f9" />
<stroke
android:width="2dp"
android:color="#dedede" />
</shape>
</item>
Now you can use it in your layout files, as follows:
<Button android:id="#+id/my_button"
style="#style/KeyBoardButton"
android:text="1" />

Android custom button style not working

I have this style on my styles.xml:
<style name="btnStyleGenoa" parent="#android:style/Widget.Button">
<item name="android:textSize">15sp</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:gravity">center</item>
<item name="android:shadowColor">#000000</item>
<item name="android:shadowDx">1</item>
<item name="android:shadowDy">1</item>
<item name="android:shadowRadius">0.6</item>
<item name="android:background">#drawable/custom_btn_genoa</item>
<item name="android:padding">10dip</item>
</style>
I also have this custom_btn_genoa.xml on drawable folder:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" >
<shape android:shape="rectangle" >
<corners android:radius="3dip" />
<stroke android:width="1dip" android:color="#20534e" />
<gradient android:angle="-90" android:startColor="#062d30" android:endColor="#4c898e" />
</shape>
</item>
<item android:state_focused="true">
<shape android:shape="rectangle" >
<corners android:radius="3dip" />
<stroke android:width="1dip" android:color="#20534e" />
<solid android:color="#125156"/>
</shape>
</item>
<item >
<shape android:shape="rectangle" >
<corners android:radius="3dip" />
<stroke android:width="1dip" android:color="#20534e" />
<gradient android:angle="-90" android:startColor="#4c898e" android:endColor="#125156" />
</shape>
</item>
</selector>
Finally, i have this button:
<Button
android:text="#string/change_but"
android:textSize="15dp"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:id="#+id/change_but"
android:onClick="onChangeClicked"
style=”#style/btnStyleGenoa”
/>
The button does not use the desired style. Last line in button (style) says "attribute value expected. Any thoughts?
(Note, i found this code on a website, it's not mine)
You must replace style=”#style/btnStyleGenoa” to style="#style/btnStyleGenoa"
Working like a charm.

Listview Custom Selector issue

i have a simple custom selector for my listview but i get an xml error any ideas why?
Errors:
unbound prefix (line 3)
not well formatted (invalid token) (line 5)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android ="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:state_selected="false"
<color android:color = "#FF8800" />
<item android:state_pressed="true" >
<shape>
<gradient
android:startColor="#E77A26"
android:endColor="#E77A26"
android:angle="270" />
</shape>
</item>
<item android:state_selected="true" android:state_pressed="false"
<color android:color = "#FF8800" />
</selector>
As Nadir B suggested, you didn't close your tag properly, unfortunately he suggested a wrong solution.
Item must wrap the color element(<item ...> ... <color... /> </item>) and not be a self closing element (eg <item ... />).
You have made this mistake twice in the example you have given. Ensure you notice both changes.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android ="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:state_selected="false"
<color android:color = "#FF8800" />
<item android:state_pressed="true" >
<shape>
<gradient
android:startColor="#E77A26"
android:endColor="#E77A26"
android:angle="270" />
</shape>
</item>
<item android:state_selected="true" android:state_pressed="false"
<color android:color = "#FF8800" />
</selector>
Should be
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android ="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:state_selected="false">
<color android:color = "#FF8800" />
</item>
<item android:state_pressed="true" >
<shape>
<gradient
android:startColor="#E77A26"
android:endColor="#E77A26"
android:angle="270" />
</shape>
</item>
<item android:state_selected="true" android:state_pressed="false">
<color android:color = "#FF8800" />
</item>
</selector>
your not closing your xml tag
the problem is here
<item android:state_selected="true" android:state_pressed="false"
remove tab before
<?xml version="1.0" encoding="utf-8"?>
do like this
EDIT remove the space in xmlns like this
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:state_selected="false"/>
<color android:color = "#FF8800" />
<item android:state_pressed="true" >
<shape>
<gradient
android:startColor="#E77A26"
android:endColor="#E77A26"
android:angle="270" />
</shape>
</item>
<item android:state_selected="true" android:state_pressed="false"/>
<color android:color = "#FF8800" />
</selector>

Categories

Resources