Вопрос

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

Разделы 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();

Есть ли способ заменить отображаемый значок без удаления и повторного создания всех вкладок?

Это было полезно?

Решение

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

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

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

Другие советы

Просто чтобы подтвердить ответ доминиканцев, вот его решение в коде (это действительно работает):

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

Это может быть немного поздно, но вы можете взглянуть на эту тему

http://groups.google.com/group/android -developers / browse_thread / резьба / ef3bdebcb715b385

Смотрите мой пост с примером кода, касающимся Настраиваемые вкладки Android.

Спасибо Spct

Это то, что я сделал, и это работает для меня. Я создал эту функцию в упражнении, которое распространяется на 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);

Попробуйте это:

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));
        }
    }
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top