android - 切换方向错误 : Fragment Error - Duplicate id, 标记,或父 id 0x0

标签 android fragment orientation-changes

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

<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 在方向改变时会被调用两次吗?

最佳答案

明白了:

错误是 SearchPageFragment 的 holder Activity 添加了两次 Fragment

当方向发生变化时,Android 将始终保留附加到 View 的 fragment 。

正因为如此,您需要确保如果您在 onCreate() 方法中添加一个 Fragment,您会使用 if 语句将其创建(和添加/替换转换)包围起来以检查savedInstanceState 为 null(如果它不为 null,则表示发生了方向更改)。

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

关于android - 切换方向错误 : Fragment Error - Duplicate id, 标记,或父 id 0x0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760369/

相关文章:

android - v4 getFragmentManager 与 Activity - 不兼容的类型

android - Eclipse 自动创建 fragment 布局,如何禁用它

android - 启动结果对话框以将值返回到主要 Activity

javascript - Firefox 不支持 Angular 方向更改事件

iOS:如何确定 viewWillAppear 中的当前方向?

android - 检测应用程序何时完全绘制并可见

android - 如何在模拟器中将 CA 证书导入 Android 4.4.2?

java - 方向变化的线程

android - 带有三角形项目的 ListView

android - 错误 :Expected caller to ensure valid ABI: ARM64_V8A