Android 无法使用选项卡启动活动错误

Android 无法使用选项卡启动活动错误,android,multithreading,android-asynctask,android-tabhost,activitygroup,Android,Multithreading,Android Asynctask,Android Tabhost,Activitygroup,我试图通过添加一个TabHost和一些选项卡来扩展我的应用程序,以导航额外的功能。当前的应用程序基本上搜索数据库。当前应用程序工作流: 应用程序加载到登录屏幕 用户登录 用户获取搜索表单并输入数据,按“搜索” 搜索加载结果的列表活动 有了新的选项卡,就有了一个单独的用于搜索的选项卡。我希望所有搜索活动都保留在该选项卡组中。因此,我创建了一个活动组来处理所有这些问题: public class searchGroup extends ActivityGroup { publ

我试图通过添加一个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;
        }
    }
    
    这就是我撞车的地方:

    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是 无效;你的活动正在进行吗

    但是,如果我从搜索结果活动的onCreate中取消注释一行:

    new LoadSearches().execute();
    
    没有撞车,但我显然什么也没得到。LoadSearches()是一个异步任务,它执行繁重的任务,即转到服务器并运行搜索字符串,然后将返回的数据填充到onPostExecute()中的ListActivity中


    我不太明白为什么它会在这里崩溃,而在我切换活动时却不正常。我应该如何处理这个问题?有更好的办法吗?我读过一些关于碎片的书,但还没有做任何处理

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

    我的活动之间的传递数据也有问题。使用intent/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;     
    }
    
    使用此方法,使用片段的新方法:

    Avtivity1

    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();  
    
    活动2(onCreateView)


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

    我也得到了这个错误你有什么解决办法吗
    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();  
    
    Bundle b = getArguments();
    strSearch = b.getString("SEARCHSTRING");