Подтвердить что ты не робот

Android - переключение вкладок изнутри действия на вкладке

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

4b9b3361

Ответ 1

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

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

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, если бы использовал их снова.

Ответ 2

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

Чтобы избежать создания новой активности вкладки, когда вкладка хочет перейти на другую вкладку, я помещаю ее в свой 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);
  }
}

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

Ответ 3

Во-первых, я установил метод для моего основного класса, который расширяет TabActivity, называя его "MainActivity"

public TabHost getMyTabHost() { return tabHost; }

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

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

Это сработало для меня.

Ответ 4

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

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

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

Ответ 5

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

Я решил обработать его с помощью 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);
   } 
}

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

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

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

Ответ 6

public void switchTab(int index){
   MintTrack ParentActivity;
   ParentActivity = (MintTrack) this.getParent();
   ParentActivity.getTabHost().setCurrentTab(index);
}

Ответ 7

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

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

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