2010-06-28 4 views
0

Je voudrais définir le contenu de chaque onglet dans un fichier XML différent afin que l'éditeur visuel dans Eclipse puisse être utilisé. C'est-à-dire, sans que tous les onglets soient placés l'un sur l'autre. L'éditeur visuel ne semble même pas fonctionner avec l'exemple XML fourni ici: [link text] [1] [1]: http://developer.android.com/guide/tutorials/views/hello-tabwidget.html "Ici", Il a juste une exception de pointeur Null.Est-il possible de définir le contenu de chaque onglet dans un fichier XML séparé?

J'ai essayé de définir chaque tap dans son propre fichier, par exemple:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
<TextView android:text="@+id/TextView01" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
</RelativeLayout> 

Et lorsque vous ajoutez l'onglet j'utiliser:

mTabHost.addTab(mTabHost.newTabSpec("tab_in").setIndicator("Input").setContent(R.layout.input)); 

Mais ce qui provoque l'application de tomber en panne sur le lancement . Est-ce qu'il y a un moyen de faire ça?

Merci

Répondre

3

Just my 2cents. J'ai eu beaucoup de problèmes en utilisant un tabhost basé sur l'intention. J'ai rencontré des comportements vraiment étranges surtout avec le widget ListView. j'ai pu débarrasser tous mes problèmes quand je commencé à réécrire mon projet dans une approche fondée sur les tabhost au lieu d'utiliser séparés Intent/activités

Vous pouvez toujours votre XML séparé par Tab

En bref, c'est ce que j'ai fait:

public class TabOneView implements TabContentFactory { 

    private LayoutInflater mInflater; 

    public TabOneView(Context context){ 
     mInflater = LayoutInflater.from(context); 
    } 
    @Override 
    public View createTabContent(String arg0) { 

     View v = mInflater.inflate(R.layout.tab_one, null); 

     /** 
     * Add your code here for buttons/list etc 
     * An object lookup for your Button: 
     */ 
     Button b = (Button)v.findViewById(R.id.btn01); 

     b.setOnClickListener(mListener); 
     //...more code 
     return v; 
    } 

} 
+0

Merci, cela a fonctionné parfaitement! Juste pour être clair, vous dites que vous obtenez un comportement étrange lorsque vous utilisez une activité distincte pour chaque onglet? Intéressant... – Matt

+0

J'obtiens de meilleurs résultats lorsque j'utilise une activité séparée pour chaque onglet lorsque les onglets sont la seule chose à l'écran, peu importe la complexité. Les activités sont bien conçues et mises en œuvre et prennent bien soin de leur cycle de vie. – ognian

0

Il est beaucoup plus pratique si vous écrivez un TabContentFactory, ou une activité distincte pour chaque onglet.

+0

Je peux mal comprendre la description de TabContentFactory, mais il semble qu'il génère du contenu à partir du code, pas un fichier XML. J'essaie d'éviter de faire de chaque onglet une activité distincte parce qu'ils doivent «parler» beaucoup l'un de l'autre. À l'heure actuelle, il semble que mon meilleur pari est d'éditer la mise en page dans un fichier séparé et de le copier dans le fichier XML de l'onglet pour le tester. – Matt

+0

TabContentFactory renvoie une vue, de sorte que vous pouvez (et il est préférable d'utiliser) View.inflate() à l'intérieur pour charger une mise en page XML. – ognian

0

Je pense que ce que vous faites fonctionnerait si vous aviez un XML valide.

Le TextView vous donne ces erreurs à cause de la partie android:text="@+id/TextView01". Changez cela en android:text="Some literal string" et cela devrait fonctionner (ou android:text="@strings/tabtextview01" en supposant un fichier strings.xml avec cette chaîne).

Votre XML devrait être:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
<TextView android:id="@+id/TextView01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@strings/tabTextView01" /><!-- 
or android:text="The string literal to display." --> 
</RelativeLayout> 
+0

android: text = "@ + id/TextView01" est le texte par défaut lorsque vous ajoutez un TextView via l'éditeur visuel. Il affiche comme "faux" lorsque vous exécutez l'application si vous ne le définissez pas avec le code. J'ai tout de même essayé de modifier la chaîne et elle se bloque toujours. – Matt

+0

Je n'ai pas accès au SDK pour le moment. Je vais essayer de faire fonctionner quelque chose quand je rentre à la maison. – kiswa

+0

Peu importe, je pense que la réponse de Francesco est probablement ce que vous cherchez. Sinon, je reviendrai chercher quelque chose qui fonctionne pour vous. – kiswa

0

vous pourriez aussi chercher à utiliser la TabHost, qui vous permet d'avoir chaque onglet soit une 'activité'

Questions connexes