Statelist drawable android:state_enabled not working in xml - android

I'm trying to add to my existing statelist drawable, a disabled state and it just doesn't work.
originally, I had this code:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/store_item_background_selected" android:state_selected="true"/>
<item android:drawable="#drawable/store_item_background"/>
</selector>
and it worked perfectly for selected and not selected.
now I wanted to add the android:state_enabled="false" like this:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/store_item_background_selected" android:state_selected="true"/>
<item android:drawable="#drawable/store_item_background" android:state_enabled="true"/>
<item android:drawable="#drawable/store_item_background_disabled"/>
</selector>
and it never switches to the disabled image.
any ideas?
EDIT
I added setEnabled(false) to the constructor of the view I'm setting this statelist drwable and now I see the disabled image, but once I set the view to enabled, it won't switch to disabled again.

Although this is a really old question, one should write a selector in this order:
disabled state first
pressed state second
normal state last
<?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:drawable="#color/due_gray" android:state_enabled="false" />
<item android:drawable="#color/whizdm_primary_dark_color" android:state_pressed="true" />
<item android:drawable="#color/whizdm_primary_color" />
</selector>

Try this
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/store_item_background_selected" android:state_enabled="true" android:state_selected="true"/>
<item android:drawable="#drawable/store_item_background" android:state_enabled="true"/>
<item android:drawable="#drawable/store_item_background_disabled" android:state_enabled="false"/>
</selector>

Related

Android ImageView set selector programatically dosen't work

temp_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#color/color1" />
<item android:state_selected="true" android:color="#color/color2" />
<item android:color="#color/color3" />
</selector>
And I applied it through the code below
imageView.setImageResource(R.drawable.image)
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(R.color.temp_selector))
I don't know why it doesn't work... What should I do?
(It has to be applied programatically. not xml.)
Use below to change color
imageView.isSelected = true
imageView.isSelected = false
Use below selector:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#color/color3" android:state_selected="false" />
<item android:color="#color/color2" android:state_selected="true"/>
<item android:color="#color/color1" android:state_pressed="true" />
</selector>

Buttons With Background Color and Image

I have a button that changes the image when it clicked.
I've done that with this code.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/ic_fullscreen_gmap" android:state_selected="false"/>
<item android:drawable="#drawable/ic_fullscreen_exit_gmap"/>
</selector>
Is it possible to change the color of the default button but Together with the Image?
I want to change it to something.
The default button color is something like gray and I want to change that.
To change both the image and the background color of your Button, you could use an ImageButton and define separate selectors for the android:src and android:background attributes.
For example:
button_src_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/ic_fullscreen_gmap"/>
<item android:state_pressed="true"
android:drawable="#drawable/ic_fullscreen_exit_gmap"/>
</selector>
button_bg_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#color/color1"/>
<item android:state_pressed="true"
android:drawable="#color/color2"/>
</selector>
And the ImageButton:
<ImageButton
android:id="#+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="#drawable/button_src_selector"
android:background="#drawable/button_bg_selector"/>
Following code will help you to change default button background:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#drawable/button_bg_selected" android:state_selected="true"></item>
<item android:drawable="#drawable/button_bg_pressed" android:state_pressed="true"></item>
<item android:drawable="#drawable/button_bg_normal"></item>
</selector>

Change button background when pressed

I want to change background of a button when it is clicked. I tried to use a selector. But It didn't work. Here is the selector (add_grp_slctr.xml):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_focused="true" android:drawable="#drawable/add_grp_d"/>
<item android:state_pressed="true" android:drawable="#drawable/add_grp_d" />
<item android:drawable="#drawable/add_grp" />
</selector>
And the button :
<Button
android:id="#+id/addGrpBtn"
android:layout_width="55dp"
android:layout_height="45dp"
android:layout_gravity="center"
android:background="#drawable/add_grp_slctr"
android:onClick="addGrpDialogOpen" />
add_grp_d and add_grp are images(png).
I tried a similar code which will be white by default, black when pressed on an onclick of a button:
//***This is the btn_selector which is to be declared in drawable folder***
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="#android:color/black" /> <!-- pressed -->
<item android:drawable="#android:color/white" /> <!-- default -->
</selector>
and called this on the button.xml -->
android:background="#drawable/btn_selector"
Hope this would help..:)
go through the http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList once. Also state_focussed for button only works when you are focussing the button using a hardware-keyboard.
As for your case
<?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" android:drawable="#drawable/button_default"/>
<item android:state_pressed="true" android:state_selected="false" android:drawable="#drawable/button_default" />
<item android:state_pressed="false" android:state_selected="true" android:drawable="#drawable/button_selected"/>
<item android:state_pressed="true" android:state_selected="true" android:drawable="#drawable/button_selected" />
<item android:drawable="#drawable/button_selected" />
</selector>
Use your selector
change your code like this
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_focused="true" android:drawable="#drawable/add_grp_d"/>
<item android:state_pressed="true" android:drawable="#drawable/add_grp" />
<item android:drawable="#drawable/add_grp_d" />
</selector>
My Code
<item android:drawable="#drawable/shadow_design_click" android:state_pressed="true"/>
<item android:drawable="#drawable/shadow_design" android:state_focused="true"/>
<item android:drawable="#drawable/shadow_design"/>
</selector>
I think you should change your selector a bit.
Check this answer here.
Instead of passing cuastom XML file, if you just want to change the color of you button then you can try with the following way.
Button lineColorCode = (Button)findViewById(R.id.button1);
Now inside button's click event use following code.
int color = Color.parseColor("#AE6118"); //The color u want
lineColorCode.setColorFilter(color);

<item> tag requires a 'drawable' attribute

I am trying to very simply style a Button. I just want it blue with with text when not pressed, and white with blue text when clicked.
I tried to do this with a style and a selector.
In my layout I have this Button:
<Button
android:id="#+id/button1"
style="#style/MyButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="#string/login" />
And in res/values/styles I have this styles.xml:
<style name="MyButton">
<item name="android:background">#drawable/btn_background</item>
<item name="android:textColor">#drawable/btn_textcolor</item>
</style>
And of course, the two selectors, in res/drawable, btn_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:color="#color/white" />
<item android:color="#color/SapphireBlue" />
</selector>
and btn_textcolor.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:color="#color/SapphireBlue" />
<item android:color="#color/white" />
</selector>
The error I get now when I either run the app, or open the layout editor is:
<item> tag requires a 'drawable' attribute
I understand the message, but I don't have a drawable, is it is a simple, flat button.
How can I create such a simple button?
Update according to this post, it should work.
Try this way,hope this will help you to solve your problem.
btn_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="#color/white" android:state_pressed="true"></item>
<item android:drawable="#drawable/white" android:state_focused="true"></item>
<item android:drawable="#drawable/SapphireBlue" android:state_enabled="true" android:state_focused="false" android:state_pressed="false"></item>
<item android:drawable="#drawable/white" android:state_enabled="false"></item>
</selector>
btn_textcolor.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#color/SapphireBlue" android:state_pressed="true"></item>
<item android:color="#drawable/SapphireBlue" android:state_focused="true"></item>
<item android:color="#drawable/white" android:state_enabled="true" android:state_focused="false" android:state_pressed="false"></item>
<item android:color="#drawable/SapphireBlue" android:state_enabled="false"></item>
</selector>
Background attribute expects a drawable and the drawable selector must be in one of the /drawable folders.
TextColor attribute expects a color and the color selector must be in one of the /color folders.
/res/color/my_textcolor_selctor.xml
/res/drawable/my_background_selector.xml
Also, the drawable selector must use 'android:drawable' for selector items (a color resource maybe used for the attribute value since a color is a drawable),
whereas the color selector must use 'android:color' for the selector items.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="#color/disabledbackgroundColor" />
<!-- default -->
<item android:drawable="#color/myBackgroundColor" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:color="#color/disabledColor" />
<!-- default -->
<item android:color="#color/defaultColor" />
</selector>
android:background seems to accept drawable selectors but not color selectors... so just leave a color as your android:background, and use a normal color selector with android:backgroundTint, which expects colors anyway:
at styles.xml:
<style name="MyButton">
<item name="android:background">#color/some_fixed_color</item>
<item name="android:backgroundTint">#color/background_color_selector</item>
<item name="android:textColor">#drawable/btn_textcolor</item>
</style>
(res/color/background_color_selector.xml is a normal color selector.)

Background color from XML

I have a layout and i want to set your background color with this xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_selected="true" android:color="#000000"></item>
<item android:color="#ffffff" ></item>
</selector>
this layout to be in a tabhost and where is selected it change your olor, how I do?
There's three "main" states you need to take into account: selected, pressed and the rest. Here's an example:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="#color/tab_background_active" />
<item android:state_pressed="true" android:drawable="#color/tab_background_pressed"/>
<item android:drawable="#color/tab_background_inactive" />
</selector>
You should also use "focused" if you care about supporting users with trackballs.

Categories

Resources