Android - Tabhost de travail dans l'Activité de la classe
OK, je dois être donnant sur quelque chose de stupide parce que je n'arrive pas à obtenir mon tabhost à afficher dans ma classe d'Activité. Je suis à la redoutable force de fermeture lorsque j'essaye d'exécuter l'application. Cela fonctionnera si je prolonge TabActivity, mais je ne peux pas faire [voir modifier ci-dessous] car une fois j'ai déplacer le code de mon prototype de projet sa va être dans une classe qui hérite de l'Activité.
Ici est la mise en page 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>
Et ici est la classe qui est en train d'essayer de créer et d'afficher le 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
C'est l'erreur que je reçois dans le journal.
11-17 16:49:51.271: INFO/com.my_proto.my_proto@43b80b50(1302): OnCreate
11-17 16:49:51.472: INFO/com.my_proto.my_proto@43b80b50(1302): get tab host
11-17 16:49:51.480: INFO/com.my_proto.my_proto@43b80b50(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
Sa se plaindre de ne pas appeler le programme d'installation, mais je suis en l'appelant. Il existe une autre version de l'installation qui a besoin d'une sorte de LocalActivityMananger. J'ai essayé de remplacer l'appel à la configuration de l'appel ci-dessous, mais pas de chance.
LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false);
host.setup(mLocalActivityManager);
[modifier] L'appel ci-dessus ne fonctionne pas donc je l'ai pris un peu en arrière. Bien que j'ai été faire une nouvelle erreur connecté.
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.
[modifier] Basé sur certains des commentaires ci-dessous j'ai réalisé que j'ai besoin d'être plus clair sur pourquoi je ne peux pas hériter de TabActivity. Une fois que j'ai le prototype de travail j'ai besoin de ce port dans une application existante de l'écran qui hérite de l'Activité. J'ai besoin de charger le TabHost dans une Mise en page à l'intérieur de cette Activité. Il sera essentiellement un LinearLayout avec une rangée d'icônes de statut, puis un LinearLayout avec le Tabhost. Je sais que si je peux obtenir ce travail, je peux passer à la phase suivante. Merci!
---------------------------
| status icons |
---------------------------
| Tab, Tab, Tab |
| |
| |
| |
---------------------------
| status icons |
---------------------------
OriginalL'auteur bursk | 2010-11-17
Vous devez vous connecter pour publier un commentaire.
Ok j'ai tout compris. Apparemment,
TabActivity
s'étendActivityGroup
, qui s'étendActivity
. Mais dans votre code votre classe étendActivity
qui n'est pas une activité de groupe.Il y a donc deux options:
1) Si vous souhaitez que le contenu de l'onglet à des activités, avoir votre classe étendre
ActivityGroup
(au lieu deActivity
). Ensuite, votre appel à l'installation devrait êtrehost.setup(getLocalActivityManager());
De cette façon, vous émulez les
TabActivity
code source.2) Si vous pouvez avoir votre contenu de l'onglet être vues (vs), gardez votre classe comme s'étendant à partir de
Activity
, et de garder votre appel àsetup()
. Mais pour le setContent partie faire quelque chose comme ceci:Et ensuite définir votre liste de vue à l'intérieur de createTabContent (c'est généralement ce que je fais - je préfère utiliser des points de vue au lieu de des activités, ainsi que le contenu des onglets).
merci homme qu'il fonctionne
OriginalL'auteur Josh Clemm
Si vous avez un scénario dans lequel vous devez utiliser la classe d'Activité pour votre Tabhost vous pouvez essayer ce qui suit, il fonctionne.
Cela a fonctionné pour moi. Bien que LocalActivityManager est obsolète, cela peut être une solution plausible jusqu'à ce que vous passer de l'un à l'aide de Fragments de l'API.
M'a sauvé la vie de la grâce.
LocalActivityManager est obsolète
OriginalL'auteur wasaig
Eu le même problème: cette question permet de Android: TabHost sans TabActivity
Apparemment, vous avez seulement besoin d'ajouter une seule ligne:
OriginalL'auteur
android:id="@+id/tabhost"
ne marche pas pour moi. Je dois écrireandroid:id="@android:id/tabhost"
OriginalL'auteur Rob
J'ai changé la classe de
et de modifier les éléments suivants:
Il semble ok pour moi
OriginalL'auteur gavin
Modifier la déclaration de classe qui a ceci:
à
qui n'était pas là quand j'ai répondu ici... qui a été modifiée après que j'ai posté la réponse...
Elle était là. J'ai ajouté les détails après votre post. Pas trop grave.
OriginalL'auteur t0mm13b
Ce que tommie dit est vrai. Vous devriez aussi regarder le tutoriel ici http://developer.android.com/resources/tutorials/views/hello-tabwidget.html
OriginalL'auteur Amir Raminfar