Vra

Ek het 'n aktiwiteit wat 'n TabHost met 'n stel van TabSpecs elk met 'n script lys met die items wat vertoon moet word deur die blad het. Wanneer elke TabSpec geskep, stel ek 'n ikoon vertoon moet word in die blad kop.

Die TabSpecs geskep in hierdie manier binne 'n setupTabs() metode wat loops om die toepaslike aantal oortjies te skep:

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

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

Daar is 'n paar gevalle waar ek wil in staat wees om die ikoon wat in elke blad vertoon word tydens die uitvoering van my program te verander. Tans is ek die verwydering van al die oortjies, en die roeping van die bo-kode weer te herskep nie.

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

Is daar 'n manier om die ikoon wat word sonder die verwydering van en re-maak van al die oortjies vertoon te vervang?

Was dit nuttig?

Oplossing

Die kort antwoord is, jy niks vermis. Die Android SDK bied nie 'n direkte metode om die aanduiding van 'n TabHost verander nadat dit geskep is. Die TabSpec word slegs gebruik om die blad te bou, sodat die verandering van die TabSpec na die feit sal geen effek hê.

Ek dink daar is 'n oplossing, al is. Bel mTabs.getTabWidget() 'n TabWidget voorwerp te kry. Dit is net 'n subklas van ViewGroup, sodat jy kan getChildCount() en getChildAt() bel om toegang te verkry tot individuele tabs binne die TabWidget. Elkeen van hierdie oortjies is ook 'n uitsig, en in die geval van 'n blad met 'n grafiese aanwyser en 'n teks etiket, dit is byna seker 'n paar ander ViewGroup (miskien 'n LinearLayout, maar dit maak nie saak) wat 'n ImageView en 'n TextView bevat . So met 'n bietjie vroetel met die debugger of Log.i, moet jy in staat wees om uit te vind 'n resep om die ImageView kry en direk verander dit.

Die nadeel is dat as jy nie versigtig is nie, die presiese uitleg van die kontrole binne 'n blad kan verander en jou app kan breek. Jou aanvanklike oplossing is dalk meer robuuste, maar dan weer dit kan lei tot ander ongewenste newe-effekte soos flikker of fokus probleme.

Ander wenke

Net om te bevestig dominics antwoord, hier is sy oplossing in kode (wat eintlik werk):

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

Natuurlik is dit nie gepoleerde glad en met behulp van die direkte indekse in getChildAt () is nie mooi glad ...

Dit mag dalk 'n bietjie laat, maar jy kan wil 'n blik op hierdie draad

http://groups.google.com/group/android -developers / browse_thread / draad / ef3bdebcb715b385

Sien my post met kode voorbeeld met betrekking tot maat Android Tabs .

Dankie Spct

Dit is wat ek gedoen het en dit werk vir my. Ek het hierdie funksie in die aktiwiteit wat strek vanaf TabBarActivity

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

Jy kan hierdie funksie na die beeld in plaas van teks verander verander of jy kan beide verander, ook jy kan dit verander na enige blad kind kry. Ek was veral geïnteresseerd in die teks van die eerste blad tydens looptyd verander.

Ek het hierdie funksie van die betrokke aktiwiteit gebruik van hierdie oproep

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

Probeer die volgende:

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));
        }
    }
});
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top