2010-07-02 10 views
42

Voglio creare schede senza estendere TabActivity. (Il motivo è che TabActivity non può gestire una barra del titolo personalizzata come sembra). HoAndroid: TabHost senza TabAttività

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'errore che ottengo è

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. 

Il XML per la vista è

<?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> 

Ho letto da qualche parte che devo usare un LocalActivityManager, Presumo che mi manca qualcosa lì. Qualcuno un'idea?

Grazie!

+0

questo tutorial potrebbe aiutare http://learnncode.wordpress.com/2013/12/18/how-to-use-tabwidget-with-fragments/ – Prachi

risposta

13

Si prega di considerare l'utilizzo di Views come contenuto delle schede. Questo non solo comporterà meno codice, meno spazio sull'heap consumato, meno spazio nello stack consumato e minore utilizzo della CPU, ma supererà anche questo problema. Qui ci sono twoexamples mostrando questa tecnica.

+1

Grazie. Ma se non lavoro con intenti come posso avere un menu diverso per ogni scheda? – paradroid666

+0

@paradroid: carica un menu diverso in base alla scheda attualmente attiva. – CommonsWare

+0

Questo è il punto fondamentale nell'utilizzo di un'attività: è una separazione funzionale migliore. –

1

Considerazioni sulla progettazione in deroga, quanto segue non funziona affatto e l'API sembra indicare che setContent(Intent i) è valido. Questo funziona quando l'attività si estende TabActivity, tuttavia, che si estende Activity e aggiungendo setup() risultati di chiamata in una cosa divertente exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

è, il LogCat suggerisce ho dimenticato di chiamare 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)); 
+0

Funziona o no? –

+0

Non ha funzionato per me. –

+0

Sembra che avrebbe dovuto essere una domanda separata. Il problema che probabilmente stai riscontrando è che non stai utilizzando TabbedActivity, il che significa che devi richiamare la configurazione con ActivityManager, come suggerito sopra. Questo ti condurrà a questo problema, a meno che tu non invii correttamente gli eventi al ActivityManager. – shortstuffsushi

86

Prima di chiamare tabHost.setup (mLocalActivityManager); è necessario aggiungere questa linea.

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

Allo stesso modo, è necessario aggiungere per onResume,

mlam.dispatchResume(); 

onPause(),

mlam.dispatchPause(isFinishing()); 
+1

Funziona! Qualcuno dovrebbe accettare questa soluzione! – shihpeng

+4

Ma potresti spiegare perché funziona dopo aver aggiunto questi metodi dispatchXXX()? Grazie mille :) – shihpeng

+0

Ottimo lavoro per me! –

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

} 
+1

'LocalActivityManager' è deprecato ora –

Problemi correlati