У меня есть фрагмент, в котором xml содержит что-то вроде этого:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="230dp">
<fragment
android:id="@+id/myFragmen1"
android:name="com...widgets.myViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text""/>
</RelativeLayout>
Мне нужно добавить 4 разных фрагмента в мой xml. Родительский фрагмент я начинаю так:
getFragmentManager().beginTransaction()
.replace(R.id.frameContainer, myFragment1)
.addToBackStack(null)
.commit();
Итак, все работает нормально, пока я не пытаюсь показать фрагмент более 1 раза. Если я нажму назад и попытаюсь снова открыть фрагмент, я получаю эту ошибку:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #17: Duplicate id 0x7f080130, tag null, or parent id 0xffffffff with another fragment for com...widgets.myViewPager
Я знаю проблему, и у меня есть решение. Я мог бы удалить фрагмент в файле onDestroy. Но этого я не хочу делать! XML-файл, содержащий другой фрагмент, создается динамически. Я получаю макет через бандл, поэтому в этом фрагменте я не могу знать, какой фрагмент показан. И если я использую эту часть более 1 раза, я должен быть уверен, что имя то же самое. Итак, мой вопрос: есть ли возможность удалить в каждом фрагменте? Чтобы каждый фрагмент удалял сам себя и родителю нечего было делать?
Спасибо за помощь
РЕДАКТИРОВАТЬ:
MyFragment myFragment1 = new MyFragment();
Bundle bundle = new Bundle();
bundle.putInt("layout",R.layout.my_fragment);
myFragment1.setArguments(bundle);
getFragmentManager().beginTransaction()
.replace(R.id.frameContainer, myFragment1)
.addToBackStack(null)
.commit();
Эти звонки я делаю из разных мест. Для каждого вызова я могу создать собственный xml с разными фрагментами. И в моем родительском фрагменте я делаю это:
int layoutId = this.getArguments().getInt("layout", 0);
if(layoutId==0)
throw new RuntimeException("LayoutId not found");
return inflater.inflate(layoutId,container,false);
После этого мой фрагмент загружает xml со всеми фрагментами, которые я установил в xml. Так я могу определить вид снаружи. После уничтожения этого фрагмента и повторного открытия он выдаст ошибку. Это потому, что все фрагменты в моем xml не уничтожаются! Мой родительский фрагмент не знает, какие фрагменты находятся в xml, поэтому я хочу, чтобы они уничтожали себя в своем классе.