【问题标题】:Switching orientation error: Fragment Error - Duplicate id, tag, or parent id 0x0切换方向错误:片段错误 - 重复 ID、标签或父 ID 0x0
【发布时间】:2014-08-29 09:11:15
【问题描述】:

我有一个片段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 在方向更改时会被调用两次吗?

【问题讨论】:

    标签: android fragment orientation-changes


    【解决方案1】:

    知道了:

    错误在于 SearchPageFragment 的持有者活动添加了两次 Fragment

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

    因此,您需要确保如果您在 onCreate() 方法中添加片段,则使用 if 语句围绕它的创建(以及添加/替换转换)来检查 savedInstanceState 是否为空(如果它不为空,表示发生了方向变化)。

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

    【讨论】:

    • 给出一个完整的答案。这并没有说明什么。
    • 对不起 Sterling,我已经更新了我的答案以更简洁。希望对您有所帮助。
    • 谢谢!现在好多了。正确答案,但现在更容易理解了。
    【解决方案2】:

    我用这个解决了这个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多