Frage

Ich habe eine Aktivität mit einem TabHost, der eine Reihe von TabSpecs mit jeweils einer Listenansicht enthält, die die Elemente enthält, die auf der Registerkarte angezeigt werden sollen.Wenn jede TabSpec erstellt wird, lege ich ein Symbol fest, das in der Tab-Kopfzeile angezeigt wird.

Die TabSpecs werden auf diese Weise innerhalb eines erstellt setupTabs() Methode, die eine Schleife durchführt, um die entsprechende Anzahl von Registerkarten zu erstellen:

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

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

Es gibt einige Fälle, in denen ich das Symbol ändern möchte, das während der Ausführung meines Programms auf jeder Registerkarte angezeigt wird.Derzeit lösche ich alle Registerkarten und rufe den obigen Code erneut auf, um sie neu zu erstellen.

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

Gibt es eine Möglichkeit, das angezeigte Symbol zu ersetzen, ohne alle Registerkarten zu löschen und neu zu erstellen?

War es hilfreich?

Lösung

Die kurze Antwort lautet: Ihnen entgeht nichts.Das Android SDK bietet keine direkte Methode zum Ändern des Indikators von a TabHost nachdem es erstellt wurde.Der TabSpec wird nur zum Erstellen der Registerkarte verwendet, also zum Ändern der TabSpec nachträglich wird keine Wirkung haben.

Ich denke jedoch, dass es einen Workaround gibt.Anruf mTabs.getTabWidget() um ein zu bekommen TabWidget Objekt.Dies ist nur eine Unterklasse von ViewGroup, damit Sie anrufen können getChildCount() Und getChildAt() um auf einzelne Registerkarten innerhalb der zuzugreifen TabWidget.Jede dieser Registerkarten ist auch eine Ansicht, und im Fall einer Registerkarte mit einer grafischen Anzeige und einer Textbeschriftung handelt es sich mit ziemlicher Sicherheit um eine andere ViewGroup (vielleicht ein LinearLayout, aber es spielt keine Rolle), die eine enthält ImageView und ein TextView.Also mit etwas Fummelei am Debugger bzw Log.i, sollten Sie in der Lage sein, ein Rezept zu finden, um das zu bekommen ImageView und ändern Sie es direkt.

Der Nachteil besteht darin, dass sich die genaue Anordnung der Steuerelemente innerhalb einer Registerkarte ändern und Ihre App möglicherweise nicht mehr funktioniert, wenn Sie nicht aufpassen.Ihre ursprüngliche Lösung ist möglicherweise robuster, kann aber auch zu anderen unerwünschten Nebenwirkungen wie Flimmern oder Fokusproblemen führen.

Andere Tipps

Um die Antwort von Dominics zu bestätigen, hier ist seine Lösung im Code (die tatsächlich funktioniert):

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

Natürlich ist es überhaupt nicht ausgefeilt und die Verwendung dieser direkten Indizes in getChildAt() ist überhaupt nicht schön ...

Es ist vielleicht etwas spät, aber vielleicht möchten Sie einen Blick auf diesen Thread werfen

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

Siehe meinen Beitrag mit Codebeispiel bezüglich Angepasste Android-Tabs.

Danke SPCT

Das habe ich getan und es funktioniert bei mir.Ich habe diese Funktion in der Aktivität erstellt, die von TabBarActivity ausgeht

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

Sie können diese Funktion ändern, um das Bild anstelle des Textes zu ändern, oder Sie können beides ändern. Sie können dies auch ändern, um ein beliebiges untergeordnetes Tab zu erhalten.Ich war besonders daran interessiert, den Text des ersten Tabs zur Laufzeit zu ändern.

Ich habe diese Funktion mit diesem Aufruf aus der entsprechenden Aktivität heraus aufgerufen

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

Versuche dies:

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));
        }
    }
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top