Я думаю, вы, возможно, неправильно поняли мой комментарий, поэтому я предложу более подробное объяснение здесь.
Одна проблема, которая обычно возникает при удалении или замене фрагментов, - это попытка удалить фрагмент, который был добавлен в макет через XML, а не программно в Java. Это , а не - это то же самое, что раздувать собственный макет фрагмента в функции onCreateView()
Java-кода фрагмента (это то, что вы, похоже, описываете в своем ответе на мой комментарий). Чтобы проиллюстрировать, о чем я говорю, я покажу вам два способа, которыми люди пытаются удалить / заменить фрагменты.
Это неправильный способ сделать это:
XML-формат:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="com.example.ExampleFragment"
android:id="@+id/example_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
Java
swapFragment()
{
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
Этот код не будет выполняться так, как вы ожидаете. Исходный фрагмент, добавленный в макет XML, не будет удален. Это потому, что макеты XML предназначены для описания статических элементов макета. Вы можете изменить их содержимое во время выполнения или скрыть их, но вы не можете удалить их из макета. Это то, о чем говорила Дайана Хэкборн в ветке обсуждения , с которой я связывался ранее.
Это правильный способ сделать это (по крайней мере, по моему опыту):
XML-макет:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Fragment will go here eventually, but it's not added in the layout -->
</LinearLayout>
Java
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
ExampleFragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.fragment_container, newFragment);
transaction.commit();
}
...
swapFragment()
{
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
Эта стратегия не добавляет фрагмент в первоначальный макет. Вместо этого он добавляет его в код Java при создании Activity. Это позволяет удалить его из макета (используя remove()
или replace()
)
Это может не решить вашу проблему, но это обычная трудность, которую создают фрагменты. Вы можете убедиться, что добавляете фрагменты надлежащим образом, чтобы их можно было удалить, а затем, если это не решит проблему, мы можем устранить неполадки в дальнейшем.