Domanda

Ho un'attività che ha un TabHost contenente una serie di TabSpec ciascuno con una visualizzazione elenco contenente gli elementi da visualizzare nella scheda.Quando viene creato ogni TabSpec, imposto un'icona da visualizzare nell'intestazione della scheda.

I TabSpec vengono creati in questo modo all'interno di un file setupTabs() metodo che esegue il loop per creare il numero appropriato di schede:

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

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

Ci sono un paio di casi in cui voglio poter cambiare l'icona visualizzata in ciascuna scheda durante l'esecuzione del mio programma.Attualmente sto eliminando tutte le schede e richiamando nuovamente il codice precedente per ricrearle.

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

Esiste un modo per sostituire l'icona visualizzata senza eliminare e ricreare tutte le schede?

È stato utile?

Soluzione

La risposta breve è che non ti stai perdendo nulla.L'SDK di Android non fornisce un metodo diretto per modificare l'indicatore di a TabHost dopo che è stato creato.IL TabSpec viene utilizzato solo per creare la scheda, quindi modificando il file TabSpec dopo il fatto non avrà alcun effetto.

Penso che ci sia una soluzione alternativa, però.Chiamata mTabs.getTabWidget() prendere un TabWidget oggetto.Questa è solo una sottoclasse di ViewGroup, così puoi chiamare getChildCount() E getChildAt() per accedere alle singole schede all'interno di TabWidget.Ognuna di queste schede è anche una Vista e, nel caso di una scheda con indicatore grafico ed etichetta di testo, si tratta quasi sicuramente di qualche altra scheda. ViewGroup (Forse un LinearLayout, ma non importa) che contiene un ImageView e un TextView.Quindi, armeggiando un po' con il debugger o Log.i, dovresti essere in grado di trovare una ricetta per ottenere il ImageView e modificarlo direttamente.

Lo svantaggio è che, se non presti attenzione, l'esatta disposizione dei controlli all'interno di una scheda potrebbe cambiare e la tua app potrebbe rompersi.La tua soluzione iniziale è forse più solida, ma potrebbe portare ad altri effetti collaterali indesiderati come sfarfallio o problemi di messa a fuoco.

Altri suggerimenti

Giusto per confermare la risposta di Dominic, ecco la sua soluzione in codice (che funziona davvero):

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

Ovviamente non è affatto rifinito e usare quegli indici diretti in getChildAt() non è affatto carino...

Potrebbe essere un po' tardi ma forse ti conviene dare un'occhiata a questo thread

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

Vedi il mio post con un esempio di codice riguardante Schede Android personalizzate.

Grazie SPCT

Questo è quello che ho fatto e per me funziona.Ho creato questa funzione nell'attività che si estende da TabBarActivity

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

Puoi modificare questa funzione per cambiare l'immagine invece del testo oppure puoi cambiarli entrambi, inoltre puoi modificarlo per ottenere qualsiasi scheda secondaria.Ero particolarmente interessato a modificare il testo della prima scheda in fase di runtime.

Ho chiamato questa funzione dall'attività pertinente utilizzando questa chiamata

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

Prova questo:

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));
        }
    }
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top