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
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
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.
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.
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.
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With