Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use selector to tint ImageView?

I want to tint my tabhost's icons using XML, instead of doing it programmatically (I wasn't able to do that anyway)...

I found this thread on SO: Android imageview change tint to simulate button click

That seems to be a pretty good solution, but I wasn't able to adapt it correctly in my project... I did the following changes:

public class TintableImageView extends ImageView {     private ColorStateList tint;      public TintableImageView(Context context) {         super(context);     }      //this is the constructor that causes the exception     public TintableImageView(Context context, AttributeSet attrs) {         super(context, attrs);         init(context, attrs, 0);     }      public TintableImageView(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         init(context, attrs, defStyle);     }      //here, obtainStyledAttributes was asking for an array     private void init(Context context, AttributeSet attrs, int defStyle) {         TypedArray a = context.obtainStyledAttributes(attrs, new int[]{R.styleable.TintableImageView_tint}, defStyle, 0);         tint = a.getColorStateList(R.styleable.TintableImageView_tint);         a.recycle();     }      @Override     protected void drawableStateChanged() {         super.drawableStateChanged();         if (tint != null && tint.isStateful())             updateTintColor();     }      public void setColorFilter(ColorStateList tint) {         this.tint = tint;         super.setColorFilter(tint.getColorForState(getDrawableState(), 0));     }      private void updateTintColor() {         int color = tint.getColorForState(getDrawableState(), 0);         setColorFilter(color);     }  } 

I also wasn't able to reference @drawable/selector.xml at android:tint, so I did this at colors.xml:

<?xml version="1.0" encoding="utf-8"?> <resources> <color name="azulPadrao">#2e7cb4</color> <drawable name="tab_icon_selector">@drawable/tab_icon_selector</drawable> </resources> 

My selector:

<?xml version="1.0" encoding="utf-8"?>  <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:tint="#007AFF" /> <item android:state_focused="true" android:tint="#007AFF" /> <item android:state_pressed="true" android:tint="#007AFF" /> <item android:tint="#929292" /> </selector> 

My tab layout:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"           android:orientation="vertical" android:id="@+id/TabLayout"           android:layout_width="fill_parent" android:layout_height="fill_parent"           android:gravity="center" android:background="@drawable/tab_bg_selector">  <com.myapp.TintableImageView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:id="@+id/imageView" android:layout_gravity="center" android:tint="@drawable/tab_icon_selector"/> <TextView android:id="@+id/TabTextView" android:text="Text"           android:layout_width="wrap_content"           android:layout_height="wrap_content" android:textColor="@drawable/tab_text_selector"           android:textSize="10dip"           android:textStyle="bold" android:layout_marginTop="2dip"/>  </LinearLayout> 

Any suggestions? Thanks in advance

EDIT

I was getting a NumberFormatException for using android:tint, when the correct was app:tint (after setting xmlns:app="http://schemas.android.com/apk/res/com.myapp")... but now I think I'm using my selector in a wrong way, because the icons are all black, no matter the state... I've tried setting <drawable name="tab_icon_selector">@drawable/tab_icon_selector</drawable> from within colors.xml, didn't work

like image 600
Lucas Jota Avatar asked Oct 21 '13 16:10

Lucas Jota


People also ask

How do you highlight in ImageView?

You need to assign the src attribute of the ImageView a state list drawable. In other words, that state list would have a different image for selected, pressed, not selected, etc. - that's how the Twitter App does it. The Google IO Schedule app has a good example of this.

Why is my ImageView not visible?

The Image does not appear at all. If you run the app in Android Api 21 or below, it is a common problem. Mainly, it is because you use high resolution, large dimension images. I recommend you to resize, shrink your images.

Can ImageView be used as button?

ImageView is used when we want to work with images or we want to display them in our application. So, this article will give you a complete idea of using an ImageView as a Button in android studio. So, without wasting further time let's go to the article and read how we can achieve this task.


1 Answers

If you're in API 21+ you can do this easily in XML with a selector and tint:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:state_activated="true">         <bitmap android:src="@drawable/ic_settings_grey"                 android:tint="@color/primary" />     </item>      <item android:drawable="@drawable/ic_settings_grey"/> </selector> 
like image 78
Christopher Perry Avatar answered Sep 19 '22 07:09

Christopher Perry