我正在尝试通过添加 TabHost 和一些选项卡来导航额外功能来扩展我的应用程序。当前的应用程序基本上是搜索数据库。当前的应用程序工作流程:
- 应用程序加载到登录屏幕
- 用户登录
- 用户得到一个搜索表单并输入数据,按“搜索”
- 搜索加载结果列表活动...
使用新选项卡,有一个单独的选项卡用于搜索。我希望所有搜索活动都保留在该选项卡组中。所以我创建了一个活动组来处理所有这些:
public class searchGroup extends ActivityGroup {
public static searchGroup group;
private ArrayList<View> history;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.history = new ArrayList<View>();
group = this;
View view = getLocalActivityManager().startActivity("search", new Intent(this,search.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
replaceView(view);
}
public void replaceView(View v) {
history.add(v);
setContentView(v);
}
public void back() {
if(history.size() > 0) {
history.remove(history.size()-1);
setContentView(history.get(history.size()-1));
}else {
finish();
}
}
@Override
public void onBackPressed() {
searchGroup.group.back();
return;
}
}
在我的搜索活动的搜索按钮 onClickListener 中:
view = searchGroup.group.getLocalActivityManager().startActivity("search_results",new Intent(search.this, search_results.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
searchGroup.group.replaceView(view);
这是我遇到崩溃的地方:
02-11 13:43:49.481: E/AndroidRuntime(1165): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.myApp/com.myApp.search_results}: android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 android.app.LocalActivityManager$LocalActivityRecord@40543360 无效;您的活动正在运行吗?
但是,如果我从 search_result 活动的 onCreate 中取消注释一行:
new LoadSearches().execute();
没有崩溃,但显然我什么也没得到。LoadSearches() 是一个 AsyncTask,它完成了到服务器并运行搜索字符串然后将返回的数据填充到 onPostExecute() 中的 ListActivity 的繁重工作。
我不太明白为什么它在这里崩溃,而不是在我切换活动时正常崩溃。我应该如何解决这个问题?有没有更好的办法?我读过一些关于 Fragments 的文章,但还没有做任何事情。