我正试图通过添加TabHost和一些选项卡来导航额外的功能来扩展我的应用程序。当前的应用程序基本上是搜索数据库。当前应用程序工作流:
- 应用程序加载到登录屏幕
- 用户登录
- 用户获取搜索表单并输入数据,然后按"搜索"
- 搜索加载结果的列表活动
有了新的选项卡,就有了一个单独的用于搜索的选项卡。我希望所有seach活动都保留在该选项卡组中。所以我创建了一个活动组来处理所有这些:
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;
}
}
在我的搜索活动的ClickListener:上的搜索按钮中
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:无法启动活动组件信息{com.myApp.com/search_results}:android.view.WindowManager$BadTokenException:无法添加窗口--token android.app.LocalActivityManager$LocalActivityRecord@40543360是无效;你的活动正在进行吗?
但是,如果我取消对search_result活动的onCreate:中的一行的注释
new LoadSearches().execute();
没有撞车,但我显然什么也没得到。LoadSearch()是一个AsyncTask,它完成了前往服务器并运行搜索字符串,然后将返回的数据填充到onPostExecute()中的ListActivity的繁重工作。
我不太明白为什么它在这里崩溃,而当我切换活动时却不正常。我应该如何解决这个问题?有更好的方法吗?我读了一些关于碎片的书,但还没有对它做任何事情。
经过多次努力,我决定使用碎片。我发现一些资源对转换我现有的应用程序以使用碎片和选项卡很有用:
Android 2.2.1、2.3、2.0中的片段。这可能吗?
http://www.e-nature.ch/tech/?p=55
http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/
我的活动之间的传递数据也有问题。使用intentit/bundle在活动之间传递数据的方式实际上并不相同,但可以稍微修改一下,仍然有效。
旧方法(将数据从Activity1传递到Activity2):
活动1
Intent myIntent = new Intent(search.this, search_results.class);
Bundle b = new Bundle();
b.putString("SEARCHSTRING", strSearch);
myIntent.putExtras(b);
startActivityForResult(myIntent, 0);
活动2
Bundle b = getIntent().getExtras();
strSearch = b.getString("SEARCHSTRING");
使用片段,我不得不为Activity2:创建一个初始值设定项
public search_results newInstance(String strSearch){
search_results f = new search_results();
Bundle b = new Bundle();
b.putString("SEARCHSTRING", strSearch);
f.setArguments(b);
return f;
}
使用这个,使用碎片的新方法:
平均1
Fragment newFragment = new search_results().newInstance(strSearch);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.realtabcontent, newFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Activity2(onCreateView)
Bundle b = getArguments();
strSearch = b.getString("SEARCHSTRING");
我希望这能帮助到别人,因为我很难在一个地方找到所有这些信息。