Android 如何从ActivityGroup堆栈中删除所有活动,并在tab click事件中加载当前选项卡中的第一个活动
很久以前,我使用TabActivity和ActivityGroup创建了一个项目(现在已弃用) 问题可能很简单,但首先我想澄清一下流程。我的Tabhost中有4个选项卡。我使用了以下代码来跟踪堆栈后面的活动 MyActivityGroup.java Home.class是我在“主页”选项卡中加载的第一个活动 这是一张显示我的流程和问题的图片 当我点击按钮时,从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
活动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。我就要完成这项任务了。请帮忙