2010-06-23 2 views
5

Я пытаюсь создать несколько вкладок, каждый из которых имеет другую активность. Единственный недостаток - я использую собственный файл макета, поэтому мой класс расширяет Activity, а не TabActivity. При попытке запустить, он терпит неудачу и предлагает позвонить TabHost.Setup(ActivityGroupManager agm)Android TabHost - Действия на каждой вкладке

У кого-нибудь есть идея/практический пример того, как это можно достичь?

Заранее спасибо

+0

"... каждый с другой деятельности" - вы, вероятно, означает разные "View". –

+0

Расширение 'TabActivity' необходимо только для основной операции, на которой размещаются вкладки. Все остальные действия на вкладках могут просто расширить Activity, и они будут работать просто отлично. – codinguser

ответ

6

Это образец моей деятельности, что также не распространяется от 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, теперь работает как очарование. – Muniu

+0

отлично работает. пожалуйста, примите ответ, нажав галочку, если это было полезно :) –

1

Сделать дополнительный класс, который расширяет TabActivity и сделать этот класс основной деятельности.

Чтобы сделать это в вашем XML явить вам будет включать в себя:

<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> 

В этом классе вы бы написать что-то вроде:

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 ... 
    } 
} 


Этот класс TabActivty может быть большим или маленьким, как вы бы хотели, но обычно это был бы полный экран, при этом каждая вкладка «Активность» загружалась в основную часть экрана, например: Example http://developer.android.com/resources/tutorials/views/images/hello-tabwidget.png


P.S. Также имейте в виду, что редактор макетов Eclipse не работает с вкладками. Это a bug which has already been logged.

2

Во-первых, определите рамку в главном макете.

<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> 

Затем создайте деятельность простирается от 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); 

Если вы хотите вкладку rolover, используйте расположение селектора:

<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> 

Вот образец скриншоты.

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

Смежные вопросы