web-dev-qa-db-ja.com

Android-タブ内のアクティビティ内からタブを切り替える

現在、3つのタブで実装されたTabHostがあり、各タブには個別のアクティビティが含まれています。私の質問は、タブホスト内にあるアクティビティの1つからタブを切り替える方法です。私はあらゆるところを見て、この問題に対する本当の答えを見つけることに失敗しました。

43
crv

この問題と長い間闘ってきた後、アクティビティベースのタブを使用しているときにタブを切り替える解決策を見つけることができました。

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を使用することを知っています。

94
crv

同じ問題が発生しました。すべてのタブで単一のアクティビティを使用する方が適切ですが、時には簡単な方法をとることが合理的な選択です。

タブを別のタブに変更するときに新しいタブアクティビティを作成しないように、これを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);
  }
}

このソリューションには欠点がありますが、詳細については明確ではありません。他の誰かがそれらを指摘するのに十分知っているかもしれません。

10

最初に、TabActivityを拡張するメソッドをメインクラスに設定し、「MainActivity」と呼びます。

public TabHost getMyTabHost() { return tabHost; }

次に、タブアクティビティクラスを追加します。

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

それは私のために働いた。

6
Sertalp Bilal

ステップ#1:TabSpecsetContent()のより適切な形式を使用して、tabs-holding-activitiesをtabs-holding-viewsに置き換えます

ステップ#2:単一のTabHost内からActivitysetCurrentTab()を呼び出す

単純なActivityではなく、Viewをタブのコンテンツにすることのメリットはまだありません。タブのコンテンツとしてActivityを使用すると、CPU時間とメモリ(したがって、バッテリ寿命)が浪費され、あなたがやろうとしていることをはるかに難しくします。

5
CommonsWare

私はわずかに異なる問題を抱えていて、同様の状況に直面している他の人のためにこれを追加すると思いました。アクティビティベースのタブ付きアプリケーションがあり、タブアクティビティの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つのアクティビティでのみ発生するため、単純にすることにしました...

3
bkurzius
public void switchTab(int index){
   MintTrack ParentActivity;
   ParentActivity = (MintTrack) this.getParent();
   ParentActivity.getTabHost().setCurrentTab(index);
}
2
Jimmy Rollins

TabActivityに_public static TabHost tabHost;_を追加しました。

その後、他のタブからMyTabActivity.tabHost.setCurrentTab(tabNumber);を実行できます

私には問題ありません(ただし、最初からフラグメントを使用したかったのですが。Androidドキュメントのタブチュートリアルに従って、そこから作業していました)

2
Tim