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!
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());
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.
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());
}
}
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));