Проблема с панелью действий и фрагментами: приложение вылетает при возврате на вкладку

Я новичок в Android и пытаюсь сделать приложение на Android Honeycomb 3.0. Вот моя проблема: у меня есть 2 вкладки на панели действий. Вкладка 1 использует фрагменты A и B, а вкладка 2 использует фрагменты C и D. Когда я загружаю приложение, выбирается вкладка 1 и отображаются фрагменты A и B. Затем я нажимаю на вкладку 2, и она также работает нормально. Но когда я возвращаюсь к вкладке 1, приложение вылетает и отображается следующая ошибка:

android.view.InflateException: строка двоичного файла XML № 6: ошибка при раздувании фрагмента класса..... ..... Вызвано: java.lang.IllegalArgumentException: строка двоичного файла XML № 6: повторяющийся идентификатор 0x7f.... ......... нулевой тег или родительский идентификатор 0x .......

вот мой код:

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

       ActionBar bar = getActionBar();
       bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
       bar.setDisplayShowTitleEnabled(false);

       ActionBar.Tab tab1 = bar.newTab().setText("tab 1");
       ActionBar.Tab tab2 = bar.newTab().setText("tab 2");
       Fragment frag1 = new FragmentOne();
       Fragment frag2 = new FragmentTwo();
       tab1.setTabListener(new MyTabListener(frag1));
       tab2.setTabListener(new MyTabListener(frag2));
       bar.addTab(tab1);
       bar.addTab(tab2);
    }
    private class MyTabListener implements ActionBar.TabListener {
        private Fragment mFragment;

        // Called to create an instance of the listener when adding a new tab
        public MyTabListener(Fragment fragment) {
            mFragment = fragment;
        }

        public void onTabSelected(Tab tab, FragmentTransaction ft) {        
        ft.add(R.id.fragments, mFragment);  
        }

        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            ft.remove(mFragment);
        }

        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // do nothing
        }

} 

Фрагмент 1:

public class FragmentOne extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View mainView = inflater.inflate(R.layout.fragments, container, false);     
        return mainView;
    }
}

фрагменты.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
           android:name="ch.comem.test.FragmentOneA"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:id="@+id/idFragment_one_a"
           android:layout_weight="30">
    </fragment>
    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
           android:name="ch.comem.test.FragmentOneB"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:id="@+id/idFragment_one_b"
           android:layout_weight="70">
    </fragment>

Thanks for your help.


person Florian    schedule 21.08.2011    source источник
comment
Пробовали ли вы присвоить каждому фрагменту уникальный тег, как это предлагается в сообщении об ошибке?   -  person Dave    schedule 21.08.2011
comment
Также я предполагаю, что есть второй XML-файл макета, поскольку тот, который вы включили, не имеет представления с именем «фрагменты».   -  person Dave    schedule 21.08.2011
comment
привет, я пробовал использовать уникальный тег для каждого фрагмента, но ошибка сохраняется. Я проверил свои файлы XML, и никакое другое представление не было названо фрагментами... Спасибо за ваш ответ.   -  person Florian    schedule 21.08.2011
comment
Не могли бы вы опубликовать свой main.xml. Непонятно, как вы собрали свой макет без него.   -  person Dave    schedule 21.08.2011


Ответы (1)


Основная проблема, которую я вижу, заключается в том, что ваш класс FragmentOne раздувает fragments.xml, который сам содержит ссылки на два дополнительных фрагмента FragmentOne и FragmentTwo. Это недопустимо, так как Фрагменты не могут содержать другие Фрагменты.

person Dave    schedule 21.08.2011
comment
Спасибо, теперь работает. Я вызываю «fragments.xml» в MainActivity, и он отлично работает. Но у меня все еще есть одна проблема: теперь у меня на двух вкладках каждый раз по 2 фрагмента. Как мне быть, если я хочу в первой вкладке 1 фрагмент, а во второй 2 фрагмента? Спасибо за вашу помощь! - person Florian; 22.08.2011