2011-07-20 24 views
4

我有一個片段SearchPageFragment(表示在平板的主視圖),其本身包含在其內部的兩個片段:切換定向誤差:片段錯誤 - 重複ID,標籤,或父ID爲0x0

<fragment android:name="com.test.fragments.SearchFormFragment" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_margin="2dp" 
      android:id="@+id/searchFormFragment" 
      android:tag="searchFormFragmentTag"> 
    <!-- Preview: [email protected]/fragment_search_form --> 
</fragment>   
<fragment android:name="com.test.fragments.SearchResultsFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/searchResultsFragment"> 
    <!-- Preview: [email protected]/fragment_search_results --> 
</fragment> 

一切工作正常 - 頁面加載和一切工作正常...直到你改變方向。當你出現下列錯誤:

java.lang.IllegalArgumentException: Binary XML file line #10: Duplicate id 0x7f08001f, tag searchFormFragmentTag, or parent id 0x0 with another fragment for com.test.fragments.SearchFormFragment 
            at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:262) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) 

下面是當您切換方向的調用序列:

SearchPageFragment(4911): Creating... 
SearchPageFragment(4911): Inflating... 
    SearchFormFragment(4911): Creating... 
    SearchFormFragment(4911): Inflating... 
    SearchResultsFragment(4911): Creating... 
    SearchResultsFragment(4911): Inflating... 

// Change Orientation 

SearchPageFragment(4911): Pausing... 
    SearchFormFragment(4911): Pausing... 
    SearchResultsFragment(4911): Pausing... 
SearchPageFragment(4911): Destroying... 
    SearchFormFragment(4911): Destroying... 
    SearchResultsFragment(4911): Destroying... 

// All Seems Normal - But... 

SearchPageFragment(4911): Creating... 
SearchPageFragment(4911): Creating... 
SearchPageFragment(4911): Inflating... 
    SearchFormFragment(4911): Creating... 
    SearchFormFragment(4911): Inflating... 
    SearchResultsFragment(4911): Creating... 
    SearchResultsFragment(4911): Inflating... 
SearchPageFragment(4911): Inflating... 

// SearchPageFragment has started twice and crashes when the second one inflates a ***unique*** component 

AndroidRuntime(4911): Shutting down VM 

有誰知道爲什麼我的容器碎片將與方向的變化被稱爲兩次?

回答

5

明白了:

的錯誤是與SearchPageFragment添加Fragment兩倍持有人的活動。

當發生方向更改時,Android將始終保留附加到視圖的片段。

因此,您需要確保如果要在onCreate()方法中添加片段,請使用if語句將其創建(以及添加/替換轉換)包含在其中,以檢查savedInstanceState是否爲空(如果它不爲null它表示已發生方向更改)。

if(savedInstanceState == null) { 
    // Add fragment code here 
} 
+0

把一個完整的答案。這並沒有說什麼。 –

+0

對不起Sterling,我已經更新了我的答案,以便更加簡潔。希望能幫助到你。 – Graeme

+1

謝謝!現在好多了。正確的答案,但現在更容易理解。 –

1

我用這個解決了這個問題。

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     if (root != null) { 
       ViewGroup parent = (ViewGroup) root.getParent(); 
       if (parent != null) 
        parent.removeView(root); 
      } 
      try { 
       root = inflater.inflate(R.layout.activity_explore,container,false); 
      } catch (InflateException e) { 
       /* map is already there, just return view as it is */ 
      } 
return root; 
} 
相關問題