42 votes

Android: TabHost sans TabActivity

Je veux créer des onglets sans étendre TabActivity. (La raison en est que TabActivity ne peut pas gérer une barre de titre personnalisée comme il semble). j'ai

 public class startTab extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);
        Resources res = getResources();
        LocalActivityManager mlam = new LocalActivityManager(this, false);
        TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
        tabHost.setup(mlam);
        TabHost.TabSpec spec;
        Intent intent;

    intent = new Intent().setClass(this, Show1.class);
    spec = tabHost.newTabSpec("Items").setIndicator("Items", res.getDrawable(R.drawable.items32_ldpi)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, Show2.class);
    spec = tabHost.newTabSpec("Users").setIndicator("Users",res.getDrawable(R.drawable.user32_ldpi)).setContent(intent);
    tabHost.addTab(spec);
}
 

}

L'erreur que je reçois est

     07-02 07:11:12.715: ERROR/AndroidRuntime(411): 
Caused by: java.lang.IllegalStateException: Activities can't be added until the containing group has been created.
 

Le xml pour la vue est

 <?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/tabhost" android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent" >
 <LinearLayout android:orientation="vertical"
  android:layout_width="fill_parent" android:layout_height="fill_parent"
  android:paddingTop="5dip">
  <TabWidget android:id="@android:id/tabs"
   android:layout_width="fill_parent" android:layout_height="fill_parent"></TabWidget>
  <FrameLayout android:id="@android:id/tabcontent"
   android:layout_width="fill_parent" android:layout_height="fill_parent"
   android:paddingTop="5dip">
  </FrameLayout>
 </LinearLayout>
</TabHost>
 

J'ai lu quelque part que je devais utiliser un LocalActivityManager, je suppose qu'il me manque quelque chose. Quelqu'un a une idée?

Merci!

86voto

dcanh121 Points 2102

Avant d'appeler tabHost.setup (mLocalActivityManager); vous devez ajouter cette ligne.

 mlam.dispatchCreate(savedInstanceState);
tabHost.setup(mlam );
 

De même, vous devez ajouter pour onResume,

 mlam.dispatchResume(); 
 

onPause (),

  mlam.dispatchPause(isFinishing());
 

13voto

CommonsWare Points 402670

Pensez à utiliser Views comme contenu de vos onglets. Cela se traduira non seulement par moins de code, moins d’espace de mémoire, moins d’espace de pile, et moins d’utilisation du processeur, mais aussi par la résolution de ce problème. Voici deux exemples illustrant cette technique.

4voto

Lefteris E Points 1523
public class ScoreboardActivity extends Activity {
    LocalActivityManager mlam;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scoreboard);
        mlam = new LocalActivityManager(this, false);
        mlam.dispatchCreate(savedInstanceState);
        TabHost th = (TabHost) findViewById(android.R.id.tabhost);
        th.setup(mlam);
        th.addTab(th.newTabSpec("Numpad").setIndicator("Numpad").setContent(R.id.tab1));
        th.addTab(th.newTabSpec("CardCount").setIndicator("CardCount").setContent(R.id.tab2));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_scoreboard, menu);
        return true;


    }
    @Override
    protected void onResume(){
        super.onResume();
        mlam.dispatchResume();
    }

    @Override
    protected void onPause(){
        super.onPause();
        mlam.dispatchPause(isFinishing());
    }

}

1voto

stanlick Points 335

Malgré les considérations de conception, les éléments suivants ne fonctionnent pas du tout et l'API semble indiquer que setContent(Intent i) est valide. Ceci fonctionne lorsque l'activité s'étend de TabActivity , cependant, l'extension de Activity et l'ajout de setup() des résultats d'appel en exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

Ce qui est drôle, c'est que le LogCat suggère que j'ai oublié d'appeler setup()

 mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();

Intent tab1Intent = new Intent(this, ActivityOne.class);
Button tab1View = new Button(this);
tab1View.setText("Activity 1");
  mTabHost.addTab(mTabHost.newTabSpec("tab_1").setIndicator(tab1View).setContent(tab1Intent));
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X