Android TabHost — действия на каждой вкладке

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

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

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


person Muniu    schedule 23.06.2010    source источник
comment
... каждый с другой активностью - вы, вероятно, имеете в виду разные представления.   -  person Mathias Conradt    schedule 23.06.2010
comment
Расширение TabActivity необходимо только для основного действия, в котором размещены вкладки. Все остальные действия на вкладках можно просто расширить, и они будут работать нормально.   -  person codinguser    schedule 23.06.2010


Ответы (3)


Это пример моей активности, которая также не распространяется на 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);
}

// ...
person Mathias Conradt    schedule 23.06.2010

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

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

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

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

Вот примеры скриншотов.

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

person rayyildiz    schedule 24.06.2010

Создайте дополнительный класс, который расширяет 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 может быть настолько большим или маленьким, насколько вы хотите, но обычно это будет полноэкранный режим, при этом активность каждой вкладки загружается в основную часть экрана, например: Пример< /a>
(источник:
android. ком)


P.S. Также имейте в виду, что редактор макетов Eclipse не работает с вкладками. Это ошибка, которая уже зарегистрирована.

person idolize    schedule 23.06.2010