web-dev-qa-db-fra.com

Android: TabHost sans TabActivity

Je veux créer des onglets sans étendant 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 j'obtiens 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 de 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 dois utiliser un LocalActivityManager, je suppose qu'il me manque quelque chose. Quelqu'un a une idée?

Merci!

42
paradroid666

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());
86
dcanh121

Veuillez envisager d'utiliser Views comme contenu de vos onglets. Non seulement cela entraînera moins de code, moins d'espace de tas consommé, moins d'espace de pile consommé et une utilisation moindre du processeur, mais cela vous permettra également de résoudre ce problème. Voici deuxexemples montrant cette technique.

13
CommonsWare
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());
    }

}
4
Lefteris E

Nonobstant 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. Cela fonctionne lorsque l'activité étend TabActivity, cependant, étendre Activity et ajouter setup() call résulte en un exception at Android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.Java:649)

Le plus drôle est que 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));
1
stanlick