2

サンプルアプリケーションには、アクティビティグループのある3つのタブがあります。最初のタブには検索アクティビティ(ホーム/ルートアクティビティ)が含まれており、同じタブ(タブ1)の下にある別のアクティビティで検索結果が表示されています。結果アクティビティで戻るボタンを押すと、アクティビティを検索します。ここまではすべて正常に動作します。戻るボタンを押す代わりに、tab1を押して検索アクティビティを実行したいと思います。どうすればこれを達成できますか?私はこのようなことを試みました

public class TabSample extends TabActivity {

    public TabHost tabHost;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        this.tabHost = getTabHost();

        tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("OPT")
                .setContent(new Intent(this, TabGroup1Activity.class)));

        tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("EDIT")
                .setContent(new Intent(this, TabGroup2Activity.class)));

        tabHost.setCurrentTab(1);

        tabHost.setOnTabChangedListener(new OnTabChangeListener() {

            public void onTabChanged(String arg0) {

                if (tabHost.getCurrentTabTag().equals("tab1")) {
                         //What should I do to display search activity here
                } else {
                    tabHost.setCurrentTab(1);
                }

            }
        });

        tabHost.setFocusable(true);
        tabHost.requestFocus();

    }
}

タブが押されたときに検索アクティビティを呼び出す方法を教えてもらえますか?一部の場合はどうなりますか?tabHost.setCurrentTab(index)を使用すると、結果アクティビティは表示されますが、検索アクティビティは表示されないためです。

注:私はこのリンクにあるチュートリアルに従いました。

4

3 に答える 3

0

あなたがしたいことはこれだと思います:「tab1」タグが選択されているとき、現在のアクティビティがそのアクティビティでない場合(およびその場合にのみ)TabGroup1Activityに戻ります(基本的に「戻る」プレスをシミュレートしたい)。

もしそうなら、あなたが望むのはこれです:

if (getCurrentActivity().getClass() != TabGroup1Activity.class) 
    getCurrentActivity().finish()
于 2012-04-12T10:03:37.427 に答える
0

あなたのことを完全に理解しているかどうかは 100% 確信が持てませんが、見てみましょう :)

onTabChanged リスナーでは、どのタブがタブ化されているかを切り替えてから、アクティビティ グループ内で通常どおりアクティビティを開くことができます。

public void onTabChanged(String tabId) {
    if (tabId.contentEquals("tab1")) {
        Intent intent = new Intent(tabHost.getContext(), TabGroup1Activity.class);
        View view = StartGroup.group.getLocalActivityManager().startActivity("tab1", intent).getDecorView();
        StartGroup.group.setContentView(view);
    }
}

コードを確認したところ、ここで説明することがもう少しあると思います。問題は、アクティビティを通常どおりスタックしないことです。代わりの回避策は、コンテンツ スタックを作成し、代わりにこれらを変更することです。だから私がやったことは、ButtonHandlerActivityGroup を拡張するクラス StartGroup を作成することです。

public class StartGroup extends ButtonHandlerActivityGroup {
// Keep this in a static variable to make it accessible for all the nested  activities, lets them manipulate the view
public static StartGroup group;

// Need to keep track of the history if you want the back-button to work properly, 
// don't use this if your activities requires a lot of memory.  
private ArrayList<View> history;

@Override
protected void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);

    this.history = new ArrayList<View>();
    group = this;

    // Start the root activity within the group and get its view
    View view = getLocalActivityManager().startActivity("UserList", new Intent(this, UserList.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();

    replaceView(view);
}
public void back() {
    if (history.size() > 0) {
        // pop the last view
        history.remove(history.size()-1);
        setContentView(history.get(history.size()-1));
    } else {
        finish();
    }
}
}

次に、TabMaster クラスまたはそれと呼ぶものから、StartGroup クラスを使用して、アクティビティ グループのコンテンツ ビューを変更できます。

これは私が 2.2 からのデバイスで動作するように書いたものなので、それを達成するためのより簡単でよりアンドロイド的な方法があるかもしれませんが、これはほとんどすべてのデバイスで動作します :)

同様のアプローチを使用する別のスレッドを次に示します: Launching activities within a tab in Android

さらにお手伝いできることがあればお知らせください。

于 2012-04-12T09:54:34.500 に答える
0

ActivityGroup に ArrayList があるため、ActivityGroup の onPause() メソッドをオーバーライドし、SearchActivity でなければならない最初の ID を除いて、ArrayList からすべての ID を削除します。したがって、他のタブに移動して SearchActivity (または Tab1 ) に戻ると、ホームが表示されます。

于 2012-04-19T07:08:58.753 に答える