切换方向错误:片段错误 - 重复的ID、标签或父ID为0x0。

4

我有一个SearchPageFragment片段(代表平板电脑上的主视图),它本身包含两个内部片段:

<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: layout=@layout/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: layout=@layout/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

有人知道为什么我的容器Fragment在屏幕方向改变时会被调用两次吗?
2个回答

5

明白了:

问题出在SearchPageFragment的持有者活动中添加了两次Fragment

当发生方向更改时,Android将始终保留附加到视图的片段。

因此,如果您在onCreate()方法中添加一个Fragment,则需要确保将其创建(以及添加/替换事务)用if语句包围以检查savedInstanceState是否为null(如果不为null,则表示已发生方向更改)。

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

提供一个完整的答案,不要说些无意义的话。 - Sterling Diaz
抱歉 Sterling,我更新了我的答案,使其更加简洁。希望能有所帮助。 - Graeme
1
谢谢!现在好多了。答案是正确的,但现在更易懂了。 - Sterling Diaz

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接