java करत एंड्रॉइड टैब प्रतीक अपडेट करना




सिनारेस्ट न्यू (5)

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

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

नकारात्मक पक्ष यह है कि यदि आप सावधान नहीं हैं, तो टैब के भीतर नियंत्रण का सटीक लेआउट बदल सकता है और आपका ऐप टूट सकता है आपका प्रारंभिक समाधान शायद अधिक मजबूत होता है, लेकिन फिर से यह अन्य अवांछित दुष्प्रभावों को लेकर हो सकता है जैसे झिलमिलाहट या फ़ोकस समस्याओं।

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

TabSpecs एक setupTabs() विधि के भीतर इस तरह से बनाया जाता है जो टैब की उचित संख्या को बनाने के लिए 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();

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



बस महाकाव्य के उत्तर की पुष्टि करने के लिए, यहां उसका समाधान कोड में है (जो वास्तव में काम करता है):

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 () में उन प्रत्यक्ष सूचकांकों का उपयोग बिल्कुल अच्छा नहीं है ...


यह वही है जो मैंने किया और यह मेरे लिए काम करता है मैंने इस फ़ंक्शन को उस गतिविधि में बनाया है जो टैबबेरएक्टिविटी से फैली हुई है

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

इसे इस्तेमाल करे:

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




android-tabhost