2010-06-23 12 views
5

J'essaie de créer plusieurs onglets, chacun avec une activité différente. Le seul inconvénient est que j'utilise un fichier de mise en page personnalisé, donc ma classe étend une activité plutôt qu'un TabActivity. Tout en essayant de courir, il échoue et suggère d'appeler TabHost.Setup(ActivityGroupManager agm)Android TabHost - Activités dans chaque onglet

Quelqu'un a une idée/un exemple pratique de la façon dont cela peut être réalisé?

Merci à l'avance

+0

"... chacun avec une autre activité" - vous dire probablement différent "View". –

+0

L'extension 'TabActivity' n'est nécessaire que pour l'activité principale qui héberge les onglets. Toutes les autres activités dans les onglets peuvent simplement prolonger l'activité et elles fonctionneront très bien. – codinguser

Répondre

6

Ceci est un exemple de mon activité qui ne s'étend pas de TabActivity:

protected TabHost tabs; 

// ... 

/** 
* Init tabs. 
*/ 
private void initTabs() { 
    tabs = (TabHost) findViewById(R.id.tabhost); 
    tabs.setup(); 
    tabs.setBackgroundResource(R.drawable.bg_midgray); 

    TabHost.TabSpec spec; 

    // Location info 
    txtTabInfo = new TextView(this); 
    txtTabInfo.setText("INFO"); 
    txtTabInfo.setPadding(0, 0, 0, 0); 
    txtTabInfo.setTextSize(14); 
    txtTabInfo.setBackgroundResource(R.drawable.bg_tab_left_inactive_right_inactive); 
    txtTabInfo.setTextColor(Color.DKGRAY); 
    txtTabInfo.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.TOP); 
    txtTabInfo.setHeight(39); 
    spec = tabs.newTabSpec("tabInfo"); 
    spec.setContent(R.id.tabInfo); 
    spec.setIndicator(txtTabInfo); 
    tabs.addTab(spec); 

    // Maps 
    txtTabMap = new TextView(this); 
    txtTabMap.setText("MAP"); 
    txtTabMap.setTextSize(14); 
    txtTabMap.setPadding(0, 0, 0, 0); 
    txtTabMap.setBackgroundResource(R.drawable.bg_tab_middle_inactive_right_active); 
    txtTabMap.setTextColor(Color.DKGRAY); 
    txtTabMap.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.TOP); 
    txtTabMap.setHeight(39); 
    spec = tabs.newTabSpec("tabMap"); 
    spec.setContent(R.id.tabMap); 
    spec.setIndicator(txtTabMap); 
    tabs.addTab(spec); 

    tabs.setCurrentTab(0); 

    tabs.setOnTabChangedListener(this); 
} 

// ... 
+0

Thnaks, fonctionne comme un charme maintenant. – Muniu

+0

super ça a marché. Veuillez accepter la réponse en cliquant sur la coche, si cela vous a été utile :) –

1

une classe supplémentaire gagnez de ce qui étend TabActivity et font cette classe l'activité principale.

Pour faire cela dans votre XML que vous manifestez comprendrait:

<activity android:name=".TabActivtyClass" android:label="@string/app_name" 
    android:theme="@android:style/Theme.NoTitleBar"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

Dans cette classe, vous écrivez quelque chose comme:

public class TabActivtyClass extends TabActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TabHost tabHost = getTabHost(); // The associated TabHost 

     // Create an Intent to launch given Activty for this tab 
     Intent i = new Intent().setClass(this, FirstActivty.class); 
     TabHost.TabSpec spec = tabHost.newTabSpec("tab_name").setIndicator("Tab Name").setContent(i); // <- references the intent we just created 
     tabHost.addTab(spec); 

     // And do the same for the other tabs ... 
    } 
} 


Cette classe TabActivty peut être aussi grand ou petit que vous voudriez, mais typiquement ce serait le plein écran, avec l'activité de chaque onglet étant chargée dans la partie principale de l'écran, comme ceci: Example http://developer.android.com/resources/tutorials/views/images/hello-tabwidget.png


P.S. Sachez également que l'éditeur de disposition Eclipse ne fonctionne pas avec les onglets. C'est a bug which has already been logged.

2

Tout d'abord, définissez un frametab dans la disposition principale.

<tabhost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android: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" android:padding="5dp"> 
    <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" android:padding="5dp"> 
     </framelayout> 
    </tabwidget> 
</linearlayout> 
</tabhost> 

Ensuite, créez une activité s'étend de TabActivity

Resources res = getResources(); 
TabHost tabHost = getTabHost(); 
TabHost.TabSpec spec; 
Intent intent; 
intent = new Intent().setClass(this, DashboardActivity.class); 
spec = tabHost.newTabSpec("home").setIndicator("Home", res.getDrawable (R.drawable.ic_tab_dashboard)).setContent(intent); 
tabHost.addTab(spec); 
intent = new Intent().setClass(this, CreditCardActivity.class); 
spec = tabHost.newTabSpec("sample1").setIndicator("Sample Tab",res.getDrawable (R.drawable.ic_tab_sample1)).setContent(intent); 
tabHost.addTab(spec); 

Si vous voulez rolover onglet, utilisez la mise en page de sélection:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/helpblue" android:state_selected="true"> 
    <item android:drawable="@drawable/helpgray"></item> 
</item></selector> 

Voici des captures d'écran exemples.

alt text http://rayyildiz.com/wp-content/uploads/2010/06/android_sample_tab-201x300.pngalt text http://rayyildiz.com/wp-content/uploads/2010/06/android_sample_tab2-201x300.png