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 |
---------------------------
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
grazie uomo funziona –