Aktualizace Android Karta Ikony

hlasů
37

I mají aktivitu, která má TabHost obsahující sadu TabSpecs každý s ListView obsahující položky, které mají být zobrazeny na kartě. Když je vytvořen každý TabSpec nastavit I ikony, který bude zobrazen v záhlaví záložky.

Tyto TabSpecs jsou vytvořeny tímto způsobem v rámci setupTabs()způsobu, který smyček vytvořit odpovídající počet karet:

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

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

Existuje několik případů, kdy chci, aby bylo možné změnit ikonu, která je zobrazena v každé kartě v průběhu realizace svého programu. V současné době jsem vymazání všech výstupky a znovu volá výše uvedený kód, aby je znovu vytvářet.

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

Existuje způsob, jak nahradit ikonu, která se zobrazí, aniž byste odstranili a znovu vytvářet všechny karty?

Položena 31/08/2008 v 15:36
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
31

Stručná odpověď zní, že jste nechybí nic. Android SDK neposkytuje přímé metody změnit ukazatelem TabHostpoté, co byla vytvořena. TabSpecSe používá pouze k budování kartu, takže změnou TabSpecpo tom, nebude mít žádný vliv.

Myslím, že je to řešení, ačkoli. Zavolat mTabs.getTabWidget(), aby si TabWidgetobjekt. To je jen podtřídou ViewGroup, takže můžete volat getChildCount()a getChildAt()přistupovat jednotlivé záložky v rámci TabWidget. Každá z těchto karet je také View, av případě karty s grafickým indikátorem a textový popis, je to téměř jistě nějaký jiný ViewGroup(možná LinearLayout, ale to nevadí), který obsahuje ImageViewa TextView. Takže s trochou šmelení s ladicí program, nebo Log.ibyste měli být schopni vymyslet recept získat co ImageViewa změnit jej přímo.

Nevýhodou je, že pokud si nedáte pozor, přesné rozložení ovládacích prvků v záložce může změnit a vaše aplikace mohla zlomit. Vaše první řešení je snad více robustní, ale na druhou stranu by to mohlo vést k dalším nežádoucím vedlejším účinkům, jako je blikání či problémy s ohniskem.

Odpovězeno 16/09/2008 v 00:59
zdroj uživatelem

hlasů
30

Jen pro potvrzení dominics odpověď, tady je jeho řešení v kódu (který skutečně funguje):

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

Samozřejmě to není leštěné vůbec a používat ty přímé indexy v getChildAt () není vůbec příjemné ...

Odpovězeno 02/02/2009 v 18:19
zdroj uživatelem

hlasů
10

To by mohlo být trochu pozdě, ale možná chceš se podívat na tomto vlákně skupiny Google

Odpovězeno 05/03/2009 v 17:17
zdroj uživatelem

hlasů
6

Viz můj příspěvek s příklad kódu o Upravené taby Android .

Díky SPCT

Odpovězeno 04/02/2009 v 06:41
zdroj uživatelem

hlasů
4

Zkuste to:

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));
        }
    }
});
Odpovězeno 04/08/2012 v 13:48
zdroj uživatelem

hlasů
4

To je to, co jsem udělal a funguje to pro mě. I tuto funkci vytvořena v činnosti, která se rozprostírá od TabBarActivity

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

Můžete upravit tuto funkci pro změnu image namísto textu, nebo můžete změnit tak, můžete také upravit to dostat nějakou kartu dítě. Byl jsem především zájem o úpravě textu na záložce prvního běhu.

Zavolal jsem tuto funkci z příslušné činnosti pomocí tohoto volání

getParent().updateTab(R.string.tab_bar_analyze);
Odpovězeno 08/07/2011 v 18:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more