4

フラグメントSearchPageFragment(タブレットのメイン ビューを表す) があり、その中に 2 つのフラグメントが含まれています。

<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 回呼び出される理由を知っている人はいますか?

4

2 に答える 2

5

とった:

バグは、SearchPageFragment のホルダー アクティビティがFragment2 回追加されたことにありました。

Android は、方向の変更が発生したときに、View にアタッチされたフラグメントを常に保持します。

このため、メソッドに Fragment を追加する場合は、そのonCreate()作成 (および追加/置換トランザクション) を if ステートメントで囲み、null であることを確認する必要がsavedInstanceStateあります (null でない場合は、方向の変更があったことを示します)。発生した)。

if(savedInstanceState == null) {
    // Add fragment code here
}
于 2011-07-20T10:55:53.247 に答える