2008-08-31 166 views
36

我有一個包含一組TabSpec的TabHost活動,每個TabSpec都有一個包含要由標籤顯示的項目的列表視圖。當創建每個TabSpec時,我會在選項卡標題中設置一個要顯示的圖標。更新Android標籤圖標

的TabSpecs在這樣一個setupTabs()方法循環到創建標籤的相應數量內創建:

TabSpec ts = mTabs.newTabSpec("tab"); 
ts.setIndicator("TabTitle", iconResource); 

ts.setContent(new TabHost.TabContentFactory(
{ 
    public View createTabContent(String tag) 
    { 
     ... 
    }    
}); 
mTabs.addTab(ts); 

有一對夫婦的情況下,我希望能夠改變其顯示圖標在執行我的程序期間在每個選項卡中。目前我正在刪除所有選項卡,並再次調用上述代碼重新創建它們。

​​3210

有沒有辦法替換正在顯示的圖標而不刪除並重新創建所有的選項卡?

回答

31

簡短的回答是,你不會錯過任何東西。 Android SDK不提供直接方法在創建後更改TabHost的指標。 TabSpec僅用於構建選項卡,因此在事實後更改TabSpec將不起作用。

雖然我認爲有一個解決方法。致電mTabs.getTabWidget()獲取TabWidget對象。這只是ViewGroup的一個子類別,因此您可以撥打getChildCount()getChildAt()訪問TabWidget中的單個選項卡。每個標籤也是一個視圖,並與圖形指示器和一個文本標籤選項卡的情況下,它幾乎肯定一些其他ViewGroup(也許LinearLayout,但它並不重要),其中包含一個ImageViewTextView 。因此,通過調試器或Log.i的小調小子,你應該能夠找出一個配方來獲得ImageView並直接改變它。

缺點是,如果你不小心,選項卡中控件的確切佈局可能會改變,你的應用程序可能會中斷。你的初始解決方案可能更強大,但是它又可能導致其他不必要的副作用,如閃爍或焦點問題。

30

只是爲了確認dominics答案,這裏是他的代碼解決方案(即實際工作):

tabHost.setOnTabChangedListener(new OnTabChangeListener() { 
    public void onTabChanged(String tabId) { 
     if (TAB_MAP.equals(tabId)) { 
      ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black)); 
      iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white)); 
     } else if (TAB_LIST.equals(tabId)) { 
      ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white)); 
      iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black)); 
     } 
    } 
}); 

當然它不是在所有的打磨和使用getChildAt的直接指標()是不是很好的。 ..

+0

小的改進 - 使用: TabWidget.getChildTabViewAt(..)而不是getChildAt(...) – tonys 2010-10-07 10:26:28

6

看到我的帖子與代碼示例有關Customized Android Tabs

感謝 SPCT

+0

太棒了!正是我在找什麼。謝謝! – Fedor 2009-11-02 06:05:39

10

這可能是有點晚了,但你可能想看看這個Google Group thread

+0

甜!這有點晚了,但很高興知道。 – lnediger 2009-07-07 01:21:10

4

這是我做的,它爲我工作。我從TabBarActivity

延伸
public void updateTab(int stringID) { 
    ViewGroup identifyView = (ViewGroup)getTabWidget().getChildAt(0); 
    TextView v = (TextView)identifyView.getChildAt(identifyView.getChildCount() - 1); 
    v.setText(stringID); 
} 

您可以修改此功能來改變圖像而不是文字,或者您可以更改活動創造了這個功能,你也可以修改此得到任何標籤的孩子。我特別感興趣的是在運行時修改第一個選項卡的文本。

我用這個電話叫從相關活動這一功能

getParent().updateTab(R.string.tab_bar_analyze); 
4

試試這個:

tabHost.setOnTabChangedListener(new OnTabChangeListener() { 
    public void onTabChanged(String tabId) { 
     if (TAB_MAP.equals(tabId)) { 
      ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black)); 
      iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white)); 
     } else if (TAB_LIST.equals(tabId)) { 
      ImageView iv = (ImageView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white)); 
      iv = (ImageView) tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon); 
      iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black)); 
     } 
    } 
}); 
0

對於3個標籤,使用:

<?xml version=「1.0」 encoding=「UTF-8」?> 

<RelativeLayout xmlns:android=「http://schemas.android.com/apk/res/android&#8221; 

android:orientation=「vertical」 

android:layout_width=「fill_parent」 

android:layout_height=「fill_parent」 

android:paddingRight=「4px」 

android:paddingLeft=「4px」 > 

<!– –> 

<TextView android:id=「@+id/tab1」 

android:layout_width=「70px」 

android:layout_height=「40px」 

android:layout_alignParentLeft=「true」 

android:layout_marginTop=「1px」 

android:layout_marginLeft=「10px」 

android:background=「@drawable/white」 /> 


<TextView android:id=「@+id/text_tab1」 

android:layout_width=「wrap_content」 

android:layout_height=「wrap_content」 

android:layout_alignParentLeft=「true」 

android:layout_marginTop=「10px」 

android:layout_marginLeft=「20px」 

android:textStyle=「bold」 

android:textSize=「17px」 

android:textColor=「@color/orange」 

android:text=「Tab1」 /> 


<TextView android:id=「@+id/tab2」 

android:layout_width=「70px」 

android:layout_height=「40px」 

android:layout_alignParentLeft=「true」 

android:layout_marginTop=「1px」 

android:layout_marginLeft=「83px」 

android:background=「@drawable/white」 /> 


<TextView android:id=「@+id/text_tab2」 

android:layout_width=「wrap_content」 

android:layout_height=「wrap_content」 

android:layout_alignParentLeft=「true」 

android:layout_marginTop=「10px」 

android:layout_marginLeft=「100px」 

android:textStyle=「bold」 

android:textSize=「17px」 

android:textColor=「@color/blue」 

android:text=「Tab2」 /> 


<TextView android:id=「@+id/tab3」 

android:layout_width=「70px」 

android:layout_height=「40px」 

android:layout_alignParentLeft=「true」 

android:layout_marginTop=「1px」 

android:layout_marginLeft=「156px」 

android:background=「@drawable/white」 /> 


<TextView android:id=「@+id/text_tab3」 

android:layout_width=「wrap_content」 

android:layout_height=「wrap_content」 

android:layout_marginTop=「10px」 

android:layout_marginLeft=「170px」 

android:textStyle=「bold」 

android:textSize=「17px」 

android:textColor=「@color/green」 

android:text=「Tab3」 /> 


<LinearLayout xmlns:android=「http://schemas.android.com/apk/res/android&#8221; 

android:id=「@+id/box_1」 

android:layout_width=「fill_parent」 

android:layout_height=「wrap_content」 

android:layout_below=「@+id/tab1」 > 


</LinearLayout> 


</RelativeLayout>