2010-11-17 14 views
11

OK, devo trascurare qualcosa di stupido perché non riesco a visualizzare il mio tabhost nella mia classe di attività. Mi sto avvicinando alla forza temuta quando provo a eseguire l'app. Funzionerà se estenderò TabActivity, , ma non posso farlo [vedi modifica sotto] perché una volta spostato il codice dal mio progetto prototipo sarà in una classe personalizzata che eredita da Activity.Android - Tabhost che funziona nella classe di attività

Ecco il layout XML:

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

E qui è la classe che sta cercando di creare e visualizzare il TabHost:

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TabHost; 

public class my_proto extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     Log.i(this.toString(), "OnCreate"); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Log.i(this.toString(), "get tab host"); 
     TabHost host = (TabHost)findViewById(R.id.tabhost); 
     host.setup(); 

     Log.i(this.toString(), "add tabs"); 
     host.addTab(host.newTabSpec("one") 
         .setIndicator("First Results") 
         .setContent(new Intent(this, FirstResultsListViewActivity.class))); 

     host.addTab(host.newTabSpec("two") 
         .setIndicator("Second Results") 
         .setContent(new Intent(this, SecondResultsListViewActivity.class))); 

     Log.i(this.toString(), "adjust tab size"); 
     host.getTabWidget().getChildAt(0).getLayoutParams().height = 35; 
     host.getTabWidget().getChildAt(1).getLayoutParams().height = 35; 

    }// end onCreate 

}// end class my_proto 

Questo è l'errore che ottengo nel registro.

11-17 16:49:51.271: INFO/[email protected](1302): OnCreate 
11-17 16:49:51.472: INFO/[email protected](1302): get tab host 
11-17 16:49:51.480: INFO/[email protected](1302): add tabs 
11-17 16:49:51.521: DEBUG/AndroidRuntime(1302): Shutting down VM 
11-17 16:49:51.521: WARN/dalvikvm(1302): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
11-17 16:49:51.530: ERROR/AndroidRuntime(1302): Uncaught handler: thread main exiting due to uncaught exception 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my_proto/com.my_proto.my_proto}: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.os.Looper.loop(Looper.java:123) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at dalvik.system.NativeStart.main(Native Method) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): Caused by: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:646) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.widget.TabHost.setCurrentTab(TabHost.java:320) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.widget.TabHost.addTab(TabHost.java:213) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at com.mc_proto.mc_proto.onCreate(my_proto.java:29) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
11-17 16:49:51.552: ERROR/AndroidRuntime(1302):  ... 11 more 

Si lamenta di non chiamare l'installazione, ma lo chiamo. C'è un'altra versione di installazione che richiede un qualche tipo di LocalActivityMananger. Ho provato a sostituire la chiamata per impostare la chiamata in basso ma senza fortuna.

LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false); 
host.setup(mLocalActivityManager); 

[modifica] La chiamata sopra non ha funzionato, quindi l'ho ritirata. Sebbene stavo ricevendo un nuovo errore registrato.

11-17 20:24:58.382: ERROR/AndroidRuntime(1432): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my_proto/com.my_proto.my_proto}: java.lang.IllegalStateException: Activities can't be added until the containing group has been created. 

[modifica] Sulla base di alcuni dei commenti qui sotto mi sono reso conto che ho bisogno di essere più chiaro sul perché non posso ereditare da TabActivity. Una volta che ho il prototipo funzionante ho bisogno di portarlo in uno schermo di un'applicazione esistente che eredita da Activity. Avrò bisogno di caricare TabHost in un layout all'interno di tale attività. Fondamentalmente sarà un LinearLayout con una riga di icone di stato, seguito da un LinearLayout con il Tabhost al suo interno. So che se riesco a farlo funzionare posso passare alla fase successiva. Grazie!

--------------------------- 
|  status icons  | 
--------------------------- 
| Tab, Tab, Tab  | 
|       | 
|       | 
|       | 
--------------------------- 
|  status icons  | 
--------------------------- 

risposta

30

Ok l'ho capito. Apparentemente, TabActivity si estende ActivityGroup, che si estende Activity. Ma nel tuo codice la tua classe estende Activity che non è un gruppo di attività.

Quindi ci sono due opzioni:

1) Se si desidera che il contenuto scheda per essere attività, hanno la classe estendere ActivityGroup (invece di Activity). Quindi la chiamata all'impostazione deve essere host.setup(getLocalActivityManager());

In questo modo si emula il codice sorgente TabActivity.

2) Se è possibile avere il contenuto della scheda come visualizzazioni (vs attività), mantenere la classe estendendosi da Activity e mantenere la chiamata su setup().Ma per la parte setContent fare qualcosa di simile:

host.addTab(host.newTabSpec("two") 
       .setIndicator("Second Results") 
       .setContent(new TabContentFactory() { 

        public View createTabContent(String tag) { 
         return new TextView(TestActivity.this); 
        } 
       })); 

E poi definire la visualizzazione elenco all'interno createTabContent (che di solito è quello che faccio - io preferisco usare vista, invece di attività come il contenuto del tab).

+0

grazie per tutto il tuo tempo. Non ci sono ancora abbastanza, se guardate la mia foto sopra ho bisogno di incuneare l'host di schede in un riquadro centrale di una schermata la cui classe base è Activity. Sono sorpreso che usando LocalActivityManager mLocalActivityManager = new LocalActivityManager (this, false); host.setup (mLocalActivityManager); non funziona quando si utilizza un'attività. Ho visto il tuo tutorial sull'uso di ListViews nelle schede e ho intenzione di esaminarlo. Attualmente ciascuna delle mie schede è una ListView, sebbene non sia sempre così. Grazie! – bursk

+1

grazie uomo funziona –

0

Modificare la dichiarazione di classe, che ha questo:

public class my_proto extends Activity 

a

public class my_proto extends TabActivity 
+0

io non posso farlo. Ho affermato nella mia descrizione "che dovrà ereditare da una classe personalizzata che eredita dall'attività" – bursk

+0

@cbursk: non era lì quando ho risposto qui ... che è stato modificato dopo aver postato la risposta ... – t0mm13b

+0

E 'stato Là. Ho aggiunto i dettagli dopo il tuo post. No biggie. – bursk

2

android:id="@+id/tabhost" non funziona per me. Devo scrivere android:id="@android:id/tabhost"

1

ho cambiato la classe per

public class my_proto extends ActivityGroup 

e modificare quanto segue:

this.mHost = (TabHost) findViewById(R.id.tabhost); 
this.mHost.setup(getLocalActivityManager()); 

sembra ok per me

+0

ActivityGroup è deprecato –

10

Se si dispone di uno scenario in cui si è necessario utilizzare la classe Attività per il tuo Tabhost puoi provare quanto segue funziona.

tabHost = (TabHost) findViewById(R.id.tabhost); //here tabHost will be your Tabhost 
    LocalActivityManager mLocalActivityManager = new LocalActivityManager(mActivity, false); 
    mLocalActivityManager.dispatchCreate(state); // state will be bundle your activity state which you get in onCreate 
    tabHost.setup(mLocalActivityManager); 
+0

Questo funziona e si continua a mantenere la propria attività come un'attività regolare. – Warpzit

+0

Questo ha funzionato per me. Sebbene LocalActivityManager sia deprecato, questa potrebbe essere una soluzione plausibile finché non si passa a utilizzare l'API Fragments. – fosstrack

+0

Mi ha salvato la vita grazie. – Anirban

8

avuto lo stesso problema: questa domanda aiuta Android: TabHost without TabActivity

A quanto pare, è sufficiente aggiungere una riga:

LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false); 
mLocalActivityManager.dispatchCreate(savedInstanceState); 
host.setup(mLocalActivityManager); 
Problemi correlati