Android - переключение вкладок изнутри Действия на вкладке - PullRequest
43 голосов
/ 30 марта 2010

В настоящее время у меня есть TabHost с 3 вкладками, каждая из которых содержит отдельное действие. Мой вопрос заключается в том, как переключаться между вкладками в рамках одного из действий, которые находятся внутри хоста вкладок. Я искал повсюду и не смог найти реального ответа на эту проблему.

Ответы [ 7 ]

94 голосов
/ 13 июня 2010

После долгого времени борьбы с этой проблемой я смог найти решение для переключения вкладок при использовании вкладок на основе действий.

В родительском классе активности, где создан tabhost, я реализовал метод, подобный приведенному ниже:

public void switchTab(int tab){
            tabHost.setCurrentTab(tab);
}

Внутри вкладки, которую я хотел бы иметь возможность внутренне переключаться на другую вкладку, я создал следующий метод:

public void switchTabInActivity(int indexTabToSwitchTo){
            MintTrack parentActivity;
            parentActivity = (MintTrack) this.getParent();
            parentActivity.switchTab(indexTabToSwitchTo);
}

Если вам нужен хороший пример этого кода, вы можете взглянуть на мой проект MintTrack здесь и здесь .

В качестве примечания, пожалуйста, будьте очень осторожны при принятии решения, использовать ли TabHost на основе вида или вида деятельности.

Activity вкладки на основе хороши тем, что их можно разделить на собственный XML-файл. Действия могут также быть организованы в свой собственный Java-файл вместо того, чтобы быть загроможденным в один. При этом некоторые вещи, которые вы могли бы подумать, будут легко усложнены с помощью вкладок на основе действий. Трудно передавать информацию между вкладками, не создавая накладных расходов. Вкладки, основанные на Activity, также используют больше памяти / процессорного времени, поскольку они имеют издержки Activity вокруг каждой из них. Пожалуйста, рассмотрите это и многие другие компромиссы, прежде чем углубляться в использование Activity на основе TabHost. Теперь я знаю, что лично я бы выбрал представление, основанное на TabHost, если бы я когда-либо использовал их снова.

10 голосов
/ 13 мая 2010

Я столкнулся с той же проблемой. Хотя лучше было бы использовать одно действие для всех вкладок, иногда разумным выбором является простой выход.

Чтобы избежать создания новой вкладки, когда вкладка хочет перейти на другую вкладку, я поместил это в свой AndroidManifest.xml:

<activity android:name=".MyTabsActivity"
        android:label="Tabs!"
        android:launchMode="singleTask">

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

class OneTabContentActivity {
  void switchTab() {
    final Intent intent = new Intent(mContext, MyTabsActivity.class);
    intent.setAction("Switch to tab 1, please");
    mContext.startActivity(intent);
}

class MyTabsActivity {
  @Override
  protected void onNewIntent (Intent intent) {
    super.onNewIntent(intent);
    getTabHost().setCurrentTab(1);
  }
}

У этого решения есть недостатки, но я не совсем уверен в деталях. Кто-то может знать достаточно, чтобы указать им.

6 голосов
/ 21 августа 2011

Сначала я установил метод для моего основного класса, который расширяет TabActivity, назовем его «MainActivity»

public TabHost getMyTabHost() { return tabHost; }

Затем я добавляю свой класс активности для вкладок;

MainActivity ta = (MainActivity) this.getParent();
TabHost th = ta.getMyTabHost();
th.setCurrentTab(0);

У меня это сработало.

5 голосов
/ 30 марта 2010

Шаг # 1: Замените действия по удержанию вкладок представлениями по удержанию вкладок, используя более совершенную форму setContent() для TabSpec

Шаг № 2: Позвоните setCurrentTab() на ваш TabHost из вашего сингла Activity

Мне еще предстоит увидеть какое-либо преимущество в том, чтобы Activity был содержимым вкладки, а не простым View. Наличие Activity в качестве содержимого вкладки тратит впустую процессорное время и память (и, следовательно, время автономной работы) и делает такие вещи, которые вы пытаетесь сделать, намного сложнее.

3 голосов
/ 10 июля 2011

У меня была немного другая проблема, и я решил добавить ее для всех, кто сталкивался с подобной ситуацией. У меня есть приложение с вкладками на основе действий, и одно из действий с вкладками запускает другое действие, которое не контролируется tabHost. Мне нужно было иметь кнопку для этой операции finish () (то есть: вернуться к основному виду вкладок) и одновременно переключаться на другую вкладку.

Я решил справиться с этим с BroadcastReceiver. В классе, который настраивает TabHost, я добавил этот класс:

class ChangeTabReceiver extends BroadcastReceiver { 
   @Override 
   public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "ChangeTabReceiver: received");
     TabHost tabHost = getTabHost();
     tabHost.setCurrentTab(1);
   } 
}

.. затем определили переменные:

ChangeTabReceiver changeTabReceiver;
IntentFilter changeTabFilter;

.. затем добавлено в onCreate ():

changeTabReceiver = new ChangeTabReceiver();
changeTabFilter = new IntentFilter(myApplication.CHANGE_TAB); 
registerReceiver(changeTabReceiver, changeTabFilter);

Наконец, в новом действии, когда вы хотите закрыть это действие и переключить вкладки, сделайте следующее:

Intent intent = new Intent(myApplication.CHANGE_TAB);
this.sendBroadcast(intent); 
this.finish();

Конечно, вы можете создать метод для переключения на различные вкладки, передавая индекс вкладок - но в моем случае это происходит только в одном действии, поэтому я решил сделать его простым ...

2 голосов
/ 02 марта 2012

Я просто поставил public static TabHost tabHost; по моему TabActivity.

Тогда из любой другой вкладки я могу сделать MyTabActivity.tabHost.setCurrentTab(tabNumber);

Хорошо работает для меня (но хотелось бы, чтобы я использовал фрагменты с самого начала. Я просто следовал учебнику по Tab в документации по Android и работал оттуда)

2 голосов
/ 20 июня 2011
public void switchTab(int index){
   MintTrack ParentActivity;
   ParentActivity = (MintTrack) this.getParent();
   ParentActivity.getTabHost().setCurrentTab(index);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...