2008-08-31 37 views
36

Tôi có một hoạt động có một TabHost chứa một tập hợp các TabSpecs với một listview chứa các mục được hiển thị bởi tab. Khi mỗi TabSpec được tạo, tôi đặt một biểu tượng được hiển thị trong tiêu đề tab.Cập nhật các biểu tượng Tab Android

Các TabSpecs được tạo ra theo cách này trong vòng một phương pháp setupTabs() mà vòng để tạo ra số lượng thích hợp của các tab:

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

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

Có một vài trường hợp mà tôi muốn để có thể thay đổi biểu tượng được hiển thị trong mỗi tab trong quá trình thực hiện chương trình của tôi. Hiện tại tôi đang xóa tất cả các tab và gọi lại mã ở trên để tạo lại chúng.

mTabs.getTabWidget().removeAllViews(); 
mTabs.clearAllTabs(true); 
setupTabs(); 

Có cách nào để thay thế biểu tượng đang được hiển thị mà không xóa và tạo lại tất cả các tab không?

Trả lời

31

Câu trả lời ngắn gọn là, bạn không bỏ lỡ bất cứ điều gì. Android SDK không cung cấp phương pháp trực tiếp để thay đổi chỉ báo của TabHost sau khi được tạo. TabSpec chỉ được sử dụng để tạo tab, vì vậy, hãy thay đổi TabSpec sau khi thực tế sẽ không có hiệu lực.

Tôi nghĩ có một giải pháp thay thế. Hãy gọi mTabs.getTabWidget() để nhận đối tượng TabWidget. Đây chỉ là một lớp con của ViewGroup, vì vậy bạn có thể gọi getChildCount()getChildAt() để truy cập các tab riêng lẻ trong số TabWidget. Mỗi tab trong số các tab này cũng là Chế độ xem và trong trường hợp tab có chỉ báo đồ họa và nhãn văn bản, hầu như chắc chắn một số khác là ViewGroup (có thể là LinearLayout, nhưng không quan trọng) có chứa ImageViewTextView . Vì vậy, với một chút nghịch ngợm với trình gỡ lỗi hoặc Log.i, bạn sẽ có thể tìm ra một công thức để có được ImageView và thay đổi nó trực tiếp.

Nhược điểm là nếu bạn không cẩn thận, bố cục chính xác của các điều khiển trong tab có thể thay đổi và ứng dụng của bạn có thể bị hỏng. Giải pháp ban đầu của bạn có lẽ là mạnh mẽ hơn, nhưng sau đó một lần nữa nó có thể dẫn đến các tác dụng phụ không mong muốn khác như nhấp nháy hoặc tập trung các vấn đề.

30

Chỉ để xác nhận dominics câu trả lời, đây là giải pháp của ông trong mã (mà thực sự hoạt động):

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)); 
     } 
    } 
}); 

Tất nhiên nó không được đánh bóng ở tất cả và sử dụng những chỉ số trực tiếp trong getChildAt() là không thoải mái chút nào. ..

+0

nhỏ cải thiện - sử dụng: TabWidget.getChildTabViewAt (..) thay vì getChildAt (...) – tonys

6

Xem bài đăng của tôi bằng mã ví dụ về Customized Android Tabs.

Cảm ơn SPCT

+0

Tuyệt vời! Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – Fedor

10

Nó có thể là muộn một chút nhưng bạn có thể muốn xem xét này Google Group thread

+0

Ngọt ngào! Đó là một chút muộn, nhưng tốt đẹp để biết không ai ít hơn. – lnediger

4

Đây là những gì tôi đã làm và nó làm việc cho tôi. Tôi tạo ra chức năng này trong các hoạt động kéo dài từ TabBarActivity

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

Bạn có thể thay đổi chức năng này để thay đổi hình ảnh thay vì văn bản hoặc bạn có thể thay đổi cả, cũng có thể bạn có thể sửa đổi này để có được bất kỳ con tab. Tôi đặc biệt quan tâm đến việc sửa đổi văn bản của tab đầu tiên khi chạy.

tôi gọi chức năng này từ các hoạt động có liên quan sử dụng cuộc gọi này

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

Hãy thử này:

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

Đối với 3 tab, sử dụng này:

<?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> 
Các vấn đề liên quan