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

时间:2012-02-11 22:22:20

标签: android multithreading android-asynctask android-tabhost activitygroup

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

  1. 应用加载到登录屏幕
  2. 用户登录
  3. 用户获取搜索表单并输入数据,按“搜索”
  4. 搜索加载结果的列表活动...
  5. 使用新标签,可以使用单独的标签进行搜索。我希望所有搜索活动都保留在该选项卡组中。所以我创建了一个活动组来处理所有这些:

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

1 个答案:

答案 0 :(得分:1)

经过多次拉扯我的头发之后,我已决定使用碎片。我发现有些资源可用于将现有应用转换为使用片段和标签:

Fragments in Android 2.2.1, 2.3, 2.0. Is this possible?

http://www.e-nature.ch/tech/?p=55

http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

我的活动之间传递数据也存在问题。使用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;     
}

使用这个,使用Fragments的新方法:

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();  

Activity2(onCreateView)

Bundle b = getArguments();
strSearch = b.getString("SEARCHSTRING");

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