Ошибка ориентации переключения: Ошибка фрагмента - дубликат идентификатора, тега или родительского идентификатора 0x0 - PullRequest
4 голосов
/ 20 июля 2011

У меня есть фрагмент 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

Кто-нибудь знает, почему мой фрагмент контейнера будет вызываться дважды приизменение ориентации?

Ответы [ 2 ]

5 голосов
/ 20 июля 2011

Понял:

Ошибка была связана с активностью держателя для SearchPageFragment, добавив дважды Fragment.

Android всегда будет сохранять фрагменты, прикрепленные к представлению, когда происходит изменение ориентации.

В связи с этим вам необходимо убедиться, что если вы добавляете фрагмент в свой метод onCreate(), вы окружаете его создание (и добавление / замену переходом) оператором if, чтобы проверить, что savedInstanceState являетсянуль (если он не ноль, это указывает на изменение ориентации).

if(savedInstanceState == null) {
    // Add fragment code here
}
1 голос
/ 02 июля 2013

Я решил проблему с помощью этого.

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