現在、3つのタブで実装されたTabHostがあり、各タブには個別のアクティビティが含まれています。私の質問は、タブホスト内にあるアクティビティの1つからタブを切り替える方法です。私はあらゆるところを見て、この問題に対する本当の答えを見つけることに失敗しました。
この問題と長い間闘ってきた後、アクティビティベースのタブを使用しているときにタブを切り替える解決策を見つけることができました。
Tabhostが作成される親アクティビティクラスで、次のようなメソッドを実装しました。
public void switchTab(int tab){
tabHost.setCurrentTab(tab);
}
内部で別のタブに切り替えることができるようにしたいタブの内部で、以下のメソッドを作成しました。
public void switchTabInActivity(int indexTabToSwitchTo){
MintTrack parentActivity;
parentActivity = (MintTrack) this.getParent();
parentActivity.switchTab(indexTabToSwitchTo);
}
このコードの良い例をご覧になりたい場合は、私のMintTrackプロジェクト here および here をご覧ください。
副次的な注意事項として、ビューベースまたはアクティビティベースのTabHostを使用するかどうかを決定するときは、非常に注意してください。
Activity
ベースのタブは、独自のXMLファイルに分割できるため、優れています。アクティビティは、1つに散らかる代わりに、独自のJavaファイルに整理することもできます。アクティビティベースのタブを使用すると、簡単になると思われるもののいくつかは複雑になります。 Activity
ベースのタブは、それぞれの周囲にActivity
のオーバーヘッドがあるため、より多くのメモリ/ CPU時間も使用します。 Activity
ベースのTabHost
の使用に飛び込みました。今度は、それらを再び使用する場合、個人的にビューベースのTabHost
を使用することを知っています。
同じ問題が発生しました。すべてのタブで単一のアクティビティを使用する方が適切ですが、時には簡単な方法をとることが合理的な選択です。
タブを別のタブに変更するときに新しいタブアクティビティを作成しないように、これを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);
}
}
このソリューションには欠点がありますが、詳細については明確ではありません。他の誰かがそれらを指摘するのに十分知っているかもしれません。
最初に、TabActivityを拡張するメソッドをメインクラスに設定し、「MainActivity」と呼びます。
public TabHost getMyTabHost() { return tabHost; }
次に、タブアクティビティクラスを追加します。
MainActivity ta = (MainActivity) this.getParent();
TabHost th = ta.getMyTabHost();
th.setCurrentTab(0);
それは私のために働いた。
ステップ#1:TabSpec
のsetContent()
のより適切な形式を使用して、tabs-holding-activitiesをtabs-holding-viewsに置き換えます
ステップ#2:単一のTabHost
内からActivity
でsetCurrentTab()
を呼び出す
単純なActivity
ではなく、View
をタブのコンテンツにすることのメリットはまだありません。タブのコンテンツとしてActivity
を使用すると、CPU時間とメモリ(したがって、バッテリ寿命)が浪費され、あなたがやろうとしていることをはるかに難しくします。
私はわずかに異なる問題を抱えていて、同様の状況に直面している他の人のためにこれを追加すると思いました。アクティビティベースのタブ付きアプリケーションがあり、タブアクティビティの1つが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();
もちろん、タブインデックスを渡すことでさまざまなタブに切り替えるメソッドを作成できますが、私の場合、この動作は1つのアクティビティでのみ発生するため、単純にすることにしました...
public void switchTab(int index){
MintTrack ParentActivity;
ParentActivity = (MintTrack) this.getParent();
ParentActivity.getTabHost().setCurrentTab(index);
}
TabActivity
に_public static TabHost tabHost;
_を追加しました。
その後、他のタブからMyTabActivity.tabHost.setCurrentTab(tabNumber);
を実行できます
私には問題ありません(ただし、最初からフラグメントを使用したかったのですが。Androidドキュメントのタブチュートリアルに従って、そこから作業していました)