2010-07-02 16 views
42

Chcę utworzyć zakładki bez przedłużania TabActivity. (Powodem jest to, że TabActivity nie może obsłużyć niestandardowego paska tytułu, jak się wydaje). MamAndroid: TabHost bez TabActivity

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

}

Błąd pojawia się

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. 

xml dla widoku jest

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

Czytałem gdzieś, że muszę użyć LocalActivityManager, Zakładam, że czegoś tam brakuje. Czy ktoś ma pomysł?

Dzięki!

+0

ten poradnik może pomóc http://learnncode.wordpress.com/2013/12/18/how-to-use-tabwidget-with-fragments/ – Prachi

Odpowiedz

13

Należy rozważyć użycie Views jako zawartości kart. Nie tylko spowoduje to mniej kodu, mniej zużytej przestrzeni sterty, mniej zużytej przestrzeni stosu i mniejsze wykorzystanie procesora, ale również pozwoli uniknąć tego problemu. Oto twoexamples pokazano tę technikę.

+1

Dzięki. Ale jeśli nie pracuję z intencją, w jaki sposób mogę mieć inne menu dla każdej karty? – paradroid666

+0

@paradroid: załaduj inne menu w oparciu o aktualnie aktywną kartę. – CommonsWare

+0

Taki jest sens korzystania z działalności - to lepsza separacja funkcjonalna. –

1

Bez względu na okoliczności, poniższe kwestie nie działają, a interfejs API wydaje się wskazywać, że setContent(Intent i) jest ważny. To działa, gdy aktywność rozciąga TabActivity jednak rozszerzenie Activity i dodanie setup() wyniki rozmów w exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

Najśmieszniejsze, tym LogCat sugeruje zapomniałem zadzwonić 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

Czy to działa czy nie? –

+0

Nie działa dla mnie. –

+0

Wygląda na to, że powinno to być osobne pytanie. Prawdopodobnie napotkasz problem polegający na tym, że nie używasz TabbedActivity, co oznacza, że ​​musisz wywołać konfigurację za pomocą ActivityManager, zgodnie z sugestiami powyżej. To doprowadzi cię do tego problemu, chyba że prawidłowo zarejestrujesz zdarzenia w ActivityManager. – shortstuffsushi

86

Przed skontaktowaniem tabHost.setup (mLocalActivityManager); musisz dodać tę linię.

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

podobnie, trzeba dodać do onResume,

mlam.dispatchResume(); 

OnPause()

mlam.dispatchPause(isFinishing()); 
+1

To działa! Ktoś powinien zaakceptować to rozwiązanie! – shihpeng

+4

Ale czy mógłbyś wyjaśnić, dlaczego to działa po dodaniu tych metod dispatchXXX? Wielkie dzięki :) – shihpeng

+0

Great pracował dla mnie! –

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' jest przestarzałe teraz –

Powiązane problemy