2013-02-21 101 views
1

如何避免ListFragment中的onCreate方法被調用兩次?ListFragment onCreate被調用兩次

我有我的列表的搜索功能。搜索結果可能比創建ListFragment後顯示的列表要短(此時您可以在後臺看到長列表,而在前景中可以看到搜索結果較短的列表)。

這裏我的代碼片段:

在我FragmentActivity:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     plantManager = new PlantManager(this); 
     listFragment = new PlantListFragment(); 
     fragmentActivityListener = listFragment; 

     if(getSupportFragmentManager().findFragmentByTag(tag) == null){ 
      try{ 
       getSupportFragmentManager().beginTransaction().replace(R.id.fragment_plantlist, listFragment,tag).commit(); 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
       CharSequence text = this.getString(R.string.info_error_list); 
       Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG); 
       toast.show(); 
      } 
     } 

     //force commit 
     getSupportFragmentManager().executePendingTransactions(); 

     buttonSearch = (Button) findViewById(R.id.button_search); 
     buttonSearch.setOnClickListener(searchListAktionen); 
    } 

從我ListFragment:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState == null){ 
      Log.d(TAG, "onCreate called"); 
      plantManager = new PlantManager(getActivity()); 
      loader = getLoaderManager().initLoader(0, null, this); 
      myAdapter = new PlantListCustomCursorAdapter(getActivity(), myCursor); 
     } 
    } 

    /** 
    * @param savedInstanceState 
    */ 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState == null){ 
      Log.d(TAG, "onActivityCreated called"); 
      //   ListView lv = getListView(); 
      //   LayoutInflater inflater = this.getLayoutInflater(savedInstanceState); 
      //   ViewGroup header = (ViewGroup)inflater.inflate(R.layout.header_aktionenlist, lv, false); 
      //   lv.addHeaderView(header, null, false); 
      this.getListView().setAdapter(myAdapter); 
     } 
    } 

爲什麼方法調用兩次?

預先感謝您的回答,

更新,但它仍然不能正常工作:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     if (savedInstanceState == null) { 
      if(getSupportFragmentManager().findFragmentByTag(tag) == null){ 
       setContentView(R.layout.activity_main); 
       listFragment = new PlantListFragment(); 
       try{ 
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_plantlist, listFragment,tag).commit(); 
        //force commit 
//     getSupportFragmentManager().executePendingTransactions(); 
       }catch(Exception ex){ 
        ex.printStackTrace(); 
        CharSequence text = this.getString(R.string.info_error_list); 
        Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG); 
        toast.show(); 
       } 
      } 
     } 
     fragmentActivityListener = listFragment; 
     plantManager = new PlantManager(this); 

     buttonSearch = (Button) findViewById(R.id.button_search); 
     buttonSearch.setOnClickListener(searchListAktionen); 
    } 
+0

'activity_main.xml'是否已經有這個片段? – Sam 2013-03-08 18:36:07

回答

2

把你的片段的初始化代碼在if-else這樣的:

if (savedInstanceState == null) { 
    listFragment = new PlantListFragment(); 
    if(getSupportFragmentManager().findFragmentByTag(tag) == null){ 
     try{ 
      getSupportFragmentManager().beginTransaction().replace(R.id.fragment_plantlist, listFragment,tag).commit(); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
      CharSequence text = this.getString(R.string.info_error_list); 
      Toast toast = Toast.makeText(this, text, Toast.LENGTH_LONG); 
      toast.show(); 
     } 
    } 

    //why you are force committing? 
    //getSupportFragmentManager().executePendingTransactions(); 
} 

這將解決你的問題。請務必在if-else內移動listFragment = new PlantListFragment();行。

+0

感謝您的回答 - 不幸的是它仍然不適合我 – user1800825 2013-02-21 16:23:39