В настоящее время у меня есть TabHost реализовано с 3 вкладками, каждая из которых содержит отдельное действие. Мой вопрос заключается в том, как переключаться между вкладками из одного из действий, расположенных внутри узла табуляции. Я искал повсюду и не смог найти реального ответа на эту проблему.
Android - переключение вкладок изнутри действия на вкладке
Ответ 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 и работал оттуда)