Обновление Android Tab иконок

голоса
37

У меня есть деятельность, которая имеет TabHost, содержащий набор TabSpecs каждый с ListView, содержащий элементы, которые будут отображаться на вкладке. Когда каждый TabSpec создается, я установить значок, который будет отображаться в заголовке вкладки.

В 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/08/2008 в 15:36
источник пользователем
На других языках...                            


6 ответов

голоса
31

Короткий ответ, вы ничего не хватает. Android SDK не предоставляет прямой метод для изменения индикатора TabHostпосле его создания. TabSpecИспользуется только для создания вкладки, поэтому изменение TabSpecпосле факта не будет иметь никакого эффекта.

Я думаю , что есть обходной путь, хотя. Позвоните , mTabs.getTabWidget()чтобы получить TabWidgetобъект. Это просто подкласс ViewGroup, так что вы можете позвонить getChildCount()и getChildAt()получить доступ к отдельным вкладкам внутри TabWidget. Каждая из этих вкладок также вид, и в случае вкладки с графическим индикатором и текстовой меткой, это почти наверняка некоторые другие ViewGroup(возможно LinearLayout, но это не имеет значения) , который содержит ImageViewи TextView. Так что с немного пустячный с отладчиком или Log.i, вы должны быть в состоянии выяснить рецепт , чтобы получить ImageViewи изменить его непосредственно.

Недостатком является то, что если вы не будете осторожны, точное расположение элементов управления в закладке может измениться, и ваше приложение может сломаться. Ваше первоначальное решение, возможно, более надежный, но опять же это может привести к другим нежелательным побочным эффектам, как мерцание или фокус проблемы.

Ответил 16/09/2008 в 00:59
источник пользователем

голоса
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 () не хорошо на всех ...

Ответил 02/02/2009 в 18:19
источник пользователем

голоса
10

Это может быть немного поздно , но вы могли бы хотеть смотреть на эту тему Google Group

Ответил 05/03/2009 в 17:17
источник пользователем

голоса
6

См мой пост с кодом , например о настраиваемой Android Tabs .

Благодаря SPCT

Ответил 04/02/2009 в 06:41
источник пользователем

голоса
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));
        }
    }
});
Ответил 04/08/2012 в 13:48
источник пользователем

голоса
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);
Ответил 08/07/2011 в 18:13
источник пользователем

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