2008-08-31 16 views
36

मेरे पास एक ऐसी गतिविधि है जिसमें एक टैबहोस्ट है जिसमें टैबस्पेक्स का एक सेट होता है जिसमें एक सूचीदृश्य होता है जिसमें टैब द्वारा प्रदर्शित किए जाने वाले आइटम होते हैं। जब प्रत्येक टैबस्पेक बनाया जाता है, तो मैंने टैब हेडर में प्रदर्शित होने के लिए आइकन सेट किया है।एंड्रॉइड टैब आइकन अपडेट करना

TabSpecs एक setupTabs() विधि है जो टैब की उपयुक्त संख्या बनाने के लिए लूप के भीतर इस तरह से बनाई गई हैं:

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

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

जानने के कुछ मामलों में जहां मैं आइकन जो प्रदर्शित किया जाता है परिवर्तित करने के लिए सक्षम होना चाहते हैं कर रहे हैं मेरे कार्यक्रम के निष्पादन के दौरान प्रत्येक टैब में। वर्तमान में मैं सभी टैब हटा रहा हूं, और उपरोक्त कोड को दोबारा बनाने के लिए फिर से कॉल कर रहा हूं।

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

क्या सभी टैब को हटाने और फिर से बनाने के बिना प्रदर्शित किए जा रहे आइकन को प्रतिस्थापित करने का कोई तरीका है?

उत्तर

31

संक्षिप्त उत्तर यह है कि आप कुछ भी याद नहीं कर रहे हैं। एंड्रॉइड एसडीके इसे बनाए जाने के बाद TabHost के सूचक को बदलने के लिए एक सीधी विधि प्रदान नहीं करता है। TabSpec का उपयोग केवल टैब बनाने के लिए किया जाता है, इसलिए इस तथ्य के बाद TabSpec बदलना होगा।

मुझे लगता है कि एक कामकाज है, हालांकि। TabWidget ऑब्जेक्ट प्राप्त करने के लिए mTabs.getTabWidget() पर कॉल करें। यह ViewGroup का सिर्फ एक उप-वर्ग है, इसलिए TabWidget के भीतर अलग-अलग टैब तक पहुंचने के लिए आप getChildCount() और getChildAt() पर कॉल कर सकते हैं। इनमें से प्रत्येक टैब भी एक दृश्य है, और एक ग्राफिकल सूचक और एक टेक्स्ट लेबल वाले टैब के मामले में, यह लगभग निश्चित रूप से कुछ अन्य ViewGroup (शायद LinearLayout है, लेकिन इससे कोई फर्क नहीं पड़ता) जिसमें ImageView और TextView शामिल है । तो डीबगर या 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

6

Customized Android Tabs के संबंध में कोड उदाहरण के साथ मेरी पोस्ट देखें।

धन्यवाद Spct

+0

बढ़िया! ठीक वही जो मेरे द्वारा खोजा जा रहा था। धन्यवाद! – Fedor

10

यह थोड़ा देर से हो सकता है, लेकिन आप इस Google Group thread

+0

स्वीट! यह थोड़ा देर हो चुकी है, लेकिन कम से कम किसी को भी जानना अच्छा नहीं है। – lnediger

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> 
संबंधित मुद्दे