动态改变TabActivity标签的tab图片的两种方法浅析

     前提:

 

     关于TabActivity的介绍,已经很多了,对于动态改变TabActivity标签的图片的介绍也有很多,但是大部分都是去监听tabchange事件,代码量大,一不小心就会把图片写错位置,需要很细心才行。我在做Contacts通讯录得时候,不小心发现了天机,只需要在XML文件里配置下即可,工作量也少了很多。下面就把这两种方法再详细的介绍给大家。这两种方法各有各的好处,还要根据情况大家自己选择。

 

第一种:OnTabChangeListener监听tab改变

     网上介绍的很多,原理就是获得TabActivity的TabHost的TabWidget,然后改变TabWidget的布局中的android.R.id.icon的ImageView的图片资源!下面把示例代码贴出来,大家看下就明白了。

 

        一个TabWidget可以add多个tab,mTabHost.getTabWidget().getChildAt(int index).index是从0开始,从左到右依次+1。

我定义了两个hashmap去存储各个tab对应的选中和未选中时的现实的图片的id。变量last对应上一个显示的tab的tabid(Tabhost.newTabSpec(String tabid),在onTabChanged(String tabid)只会将tabid传过来),我new的时候将tabid对应成index的对应的字符串,在处理的时候方便。具体看onTabChanged方法。

 

   这种方法虽然复杂,但是可以满足更复杂的需求,比如去更改tab的显示布局,都是可以的,如果只是区分当前的tab与其他tab,还是看第二种方法更简单易懂。

 

public class CallsLogTabActivity extends TabActivity implements OnTabChangeListener { private TabHost mTabHost; public static String all = "0"; public static String miss = "1"; public static String recieve = "2"; public static String dialed = "3"; private String lastTab = all; private static HashMap<String,Integer> unclickedicon = new HashMap<String,Integer>(); private static HashMap<String,Integer> clickedicon = new HashMap<String,Integer>(); static { unclickedicon.put(all,R.drawable.all_calls_log); unclickedicon.put(miss,R.drawable.missed_call_log); unclickedicon.put(dialed,R.drawable.dialled_calls_log); unclickedicon.put(recieve,R.drawable.received_calls_log); clickedicon.put(all,R.drawable.all_calls_log1); clickedicon.put(miss,R.drawable.missed_call_log1); clickedicon.put(dialed,R.drawable.dialled_calls_log1); clickedicon.put(recieve,R.drawable.received_calls_log1); } public void onTabChanged(String tabid){ int current = Integer.valueOf(tabid); int last = Integer.valueOf(lastTab); Log.i("onTabChanged",tabid); Log.i("onTabChanged---lastTab",lastTab); ImageView iv = (ImageView)mTabHost.getTabWidget().getChildAt(last).findViewById(android.R.id.icon); iv.setImageDrawable(getResources().getDrawable(unclickedicon.get(lastTab))); iv = (ImageView)mTabHost.getTabWidget().getChildAt(current).findViewById(android.R.id.icon); iv.setImageDrawable(getResources().getDrawable(clickedicon.get(tabid))); lastTab = tabid; Log.i("onTabChanged--change-lastTab",lastTab); } }

 

 

第二种:配置XML

 

       只需要在drawable文件夹下面定义一个name.xml,具体内容如下。定义selector 标签,大家自己看标签属性名字就知道各个属性代表的意思了吧,什么都不填默认是unselected状态。java代码只需要setIndicator(getText(R.string.text),getResources().getDrawable(R.drawable.name))。

        这种方法简单,但是不能去改变tab的布局,满足一般的区分当前显示的tab与其他tab还是可以的。

 

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/ic_tab_selected_recent" /> <item android:drawable="@drawable/ic_tab_unselected_recent" /> </selector>

 

java代码:

mTabHost.addTab(mTabHost.newTabSpec("0") .setIndicator(getText(R.string.text), getResources().getDrawable(R.drawable.name)) .setContent(intent));

 

 

 

你可能感兴趣的:(动态改变TabActivity标签的tab图片的两种方法浅析)