0

我正在尝试通过添加 TabHost 和一些选项卡来导航额外功能来扩展我的应用程序。当前的应用程序基本上是搜索数据库。当前的应用程序工作流程:

  1. 应用程序加载到登录屏幕
  2. 用户登录
  3. 用户得到一个搜索表单并输入数据,按“搜索”
  4. 搜索加载结果列表活动...

使用新选项卡,有一个单独的选项卡用于搜索。我希望所有搜索活动都保留在该选项卡组中。所以我创建了一个活动组来处理所有这些:

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 的文章,但还没有做任何事情。

4

1 回答 1

1

在拉了很多头发之后,我决定带着碎片去。我发现一些资源对于将我现有的应用程序转换为使用片段和选项卡很有用:

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/

我的活动之间的传递数据也有问题。使用意图/捆绑在活动之间传递数据的方式实际上并不相同,但可以稍微修改并仍然有效。

旧方式(将数据从 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");

我希望这对某人有所帮助,因为我很难在一个地方找到所有这些信息。

于 2012-02-12T21:54:25.830 回答