Android 如何从ActivityGroup堆栈中删除所有活动,并在tab click事件中加载当前选项卡中的第一个活动

Android 如何从ActivityGroup堆栈中删除所有活动,并在tab click事件中加载当前选项卡中的第一个活动,android,android-tabhost,activitygroup,android-tabactivity,Android,Android Tabhost,Activitygroup,Android Tabactivity,很久以前,我使用TabActivity和ActivityGroup创建了一个项目(现在已弃用) 问题可能很简单,但首先我想澄清一下流程。我的Tabhost中有4个选项卡。我使用了以下代码来跟踪堆栈后面的活动 MyActivityGroup.java Home.class是我在“主页”选项卡中加载的第一个活动 这是一张显示我的流程和问题的图片 当我点击按钮时,从活动A(通过图活动A浏览)。我开始这样的新活动 Intent intent = new Intent(); in

很久以前,我使用TabActivity和ActivityGroup创建了一个项目(现在已弃用)

问题可能很简单,但首先我想澄清一下流程。我的Tabhost中有4个选项卡。我使用了以下代码来跟踪堆栈后面的活动

MyActivityGroup.java

Home.class是我在“主页”选项卡中加载的第一个活动

这是一张显示我的流程和问题的图片

当我点击按钮时,从
活动A
(通过图活动A浏览)。我开始这样的新活动

Intent intent = new Intent();
            intent.setClass(getParent(), BookOverView.class);

            MyActivityGroup activityStack = (MyActivityGroup) getParent();
            activityStack.push("2ndStackActivity", intent);
tabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {

            Toast.makeText(context, "Changed", Toast.LENGTH_SHORT).show();
            while (!MyActivityGroup.stack.isEmpty()) {

                if (MyActivityGroup.stack.size()==1) {
                    break;
                }
                MyActivityGroup.stack.pop();
            }


        }
    });
这将在当前的
主页选项卡上加载我的
活动B
,同时也将活动推入堆栈

在活动B中,当我单击任意列表项时,我将在同一选项卡中使用与上述相同的代码启动新活动
(3rdStackActivity)
。它启动我的
活动c
;当我按下后退键时,它工作正常(即从“活动C”-->“活动B”-->活动A)

问题

当我站在
活动C
上时,单击
主页选项卡
(参见图活动C),它应返回到我的第一个活动(即活动A)

这是我的
主页选项卡
单击事件

getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                                    \\ Check If stack has at least more then one activity loaded.
                if (MyActivityGroup.stack.size() > 1) {

                                     //My code to clear the stack and load the 1st Activity goes here


                                     // I tried Here to clear my stack 
                                     // But not sccessfull



                }

            } else {

                getTabHost().setCurrentTab(0);

            }
        }
    });
        if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }
getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                Log.i("not Null", "Not null");

                if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }

        }

    });
我在尝试清理堆栈并开始第一堂家庭课时遇到问题

下面是我的MainActivity.java,它扩展了TabActivity

public class MainActivity extends TabActivity {

Context context = MainActivity.this;

TabHost tabHost;
TabSpec spec;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tabHost = getTabHost();
    // Android tab
    tabHost.addTab(tabHost
            .newTabSpec("Home")
            .setIndicator("Home",
                    getResources().getDrawable(R.drawable.home))
            .setContent(
                    new Intent(this, MyActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.addTab(tabHost
            .newTabSpec("Now Reading")
            .setIndicator("Now Reading",
                    getResources().getDrawable(R.drawable.now_reading))
            .setContent(
                    new Intent(this, NowReadingActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.addTab(tabHost
            .newTabSpec("Favorites")
            .setIndicator("Favorites",
                    getResources().getDrawable(R.drawable.favorites))
            .setContent(
                    new Intent(this, FavoriteActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.addTab(tabHost
            .newTabSpec("Profile")
            .setIndicator("Profile",
                    getResources().getDrawable(R.drawable.profile))
            .setContent(
                    new Intent(this, ProfileActivityGroup.class)
                            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));

    tabHost.setCurrentTabByTag("Home");

    tabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {

            Toast.makeText(context, "Changed", Toast.LENGTH_SHORT).show();

        }
    });

}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();

    getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                if (MyActivityGroup.stack.size() > 1) {


                }

            } else {

                getTabHost().setCurrentTab(0);

            }
        }
    });

}



}
编辑2


我在我的onTabClick活动中也这样做过

getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                                    \\ Check If stack has at least more then one activity loaded.
                if (MyActivityGroup.stack.size() > 1) {

                                     //My code to clear the stack and load the 1st Activity goes here


                                     // I tried Here to clear my stack 
                                     // But not sccessfull



                }

            } else {

                getTabHost().setCurrentTab(0);

            }
        }
    });
        if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }
getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                Log.i("not Null", "Not null");

                if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }

        }

    });
这将加载我的第一个活动并清除我的活动堆栈。但问题是,现在无论何时,只要将我的选项卡更改为任何其他选项卡,然后返回“主页”选项卡并按下“上一步”按钮,它就会崩溃。这是原木猫

05-31 14:15:42.769: E/AndroidRuntime(550): FATAL EXCEPTION: main
05-31 14:15:42.769: E/AndroidRuntime(550): java.lang.NullPointerException
05-31 14:15:42.769: E/AndroidRuntime(550):  at my.islamic.books.lib.app.MyActivityGroup.pop(MyActivityGroup.java:120)
05-31 14:15:42.769: E/AndroidRuntime(550):  at my.islamic.books.lib.app.MyActivityGroup.finishFromChild(MyActivityGroup.java:30)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.finish(Activity.java:3259)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.onBackPressed(Activity.java:1920)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.onKeyUp(Activity.java:1898)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.KeyEvent.dispatch(KeyEvent.java:1280)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.dispatchKeyEvent(Activity.java:2078)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.widget.TabHost.dispatchKeyEvent(TabHost.java:278)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.Activity.dispatchKeyEvent(Activity.java:2073)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.os.Looper.loop(Looper.java:123)
05-31 14:15:42.769: E/AndroidRuntime(550):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-31 14:15:42.769: E/AndroidRuntime(550):  at java.lang.reflect.Method.invokeNative(Native Method)
05-31 14:15:42.769: E/AndroidRuntime(550):  at java.lang.reflect.Method.invoke(Method.java:507)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-31 14:15:42.769: E/AndroidRuntime(550):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-31 14:15:42.769: E/AndroidRuntime(550):  at dalvik.system.NativeStart.main(Native Method)

在我的HomeTab单击事件中,我已经这样做了

getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                                    \\ Check If stack has at least more then one activity loaded.
                if (MyActivityGroup.stack.size() > 1) {

                                     //My code to clear the stack and load the 1st Activity goes here


                                     // I tried Here to clear my stack 
                                     // But not sccessfull



                }

            } else {

                getTabHost().setCurrentTab(0);

            }
        }
    });
        if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }
getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (getTabHost().getCurrentTab() == 0) {

                Log.i("not Null", "Not null");

                if (MyActivityGroup.stack.size() > 1) {

                    while (!MyActivityGroup.stack.isEmpty()) {
                        MyActivityGroup.stack.pop();
                    }

                    Intent homeIntent = new Intent();
                    homeIntent.setClass(MainActivity.this, Home.class);
                    MyActivityGroup activityStack = (MyActivityGroup) getCurrentActivity();

                    activityStack.push("HomeActivity", homeIntent);
                }

            } else {

                getTabHost().setCurrentTab(0);

            }

        }

    });
此外,在选项卡Change listner上,我还必须清除我的activityGroup堆栈。所以我做了我喜欢这个

Intent intent = new Intent();
            intent.setClass(getParent(), BookOverView.class);

            MyActivityGroup activityStack = (MyActivityGroup) getParent();
            activityStack.push("2ndStackActivity", intent);
tabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {

            Toast.makeText(context, "Changed", Toast.LENGTH_SHORT).show();
            while (!MyActivityGroup.stack.isEmpty()) {

                if (MyActivityGroup.stack.size()==1) {
                    break;
                }
                MyActivityGroup.stack.pop();
            }


        }
    });

嗯,我终于找到了我的头颅:)

如果我正确理解了你的问题,你的预期结果是回家时把活动A、B、C从堆栈中清除。但现在的实际结果是什么?从活动C单击“主页”后,它会转到哪个活动?是的,这正是我要问的。我已成功加载第一个活动。但是我不能清除我的堆栈。它崩溃了。我正在更新我的问题。@Ryan请查看编辑。崩溃日志怎么说?您是否尝试记录后堆栈的大小?通常,push()中的flag_ACTIVITY_CLEAR_TOP与您的尝试完全相同,但由于它正在崩溃,在应用程序的整个生命周期中,后堆栈可能会发生意外情况。@Ryan请立即查看我的编辑2。我就要完成这项任务了。请帮忙