Фрагмент не работает с использованием фрагмента тега, работает в framelayout
Фрагмент не работает при использовании фрагмента тега в макете XML. Но после замены фрагмента тега на Framelayout он работает нормально, без каких-либо изменений в моем коде.
Когда я использую код ниже фрагмент не меняется / работает.
<fragment
android:id="@+id/fragment_container"
android:name="com.example.user.example.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btnPressMe"
/>
Но когда я заменяю приведенный выше код на код ниже, он меняется / работает.
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btnPressMe">
</FrameLayout>
Java-код:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment2 fragment2 = new Fragment2();
fragmentTransaction.replace(R.id.fragment_container, fragment2);
fragmentTransaction.commit();
2 ответа
Если вы хотите вставить другой фрагмент, вы должны использовать
getChildFragmentManager() вместо getFragmentManager()
FragmentManager fobject = getChildFragmentManager();
FragmentTransaction transaction = fobject .beginTransaction();
fragment_container= fobject .findFragmentById(R.id.fragment_container);
if (fragment_container!= null) {
transaction.replace(R.id.fragment_container, yournewfragment);
transaction.commit();
}
transaction.commit();
Добавление фрагментов статически в файл макета
Чтобы использовать новый фрагмент, вы можете статически добавить его в макет XML. В этом случае атрибут android:name указывает на соответствующий класс, как показано в следующем фрагменте кода.
<fragment
android:id="@+id/listFragment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
class="com.example.android.rssreader.MyListFragment" ></fragment>
<fragment
android:id="@+id/detailFragment"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent"
class="com.example.android.rssreader.DetailFragment" >
</fragment>
Использование этого сценария имеет смысл в случае, если у вас есть разные файлы статической разметки для разных конфигураций устройства.
Обработка динамики во фрагментах
Класс, к которому можно получить доступ в действии через getFragmentManager()
Метод позволяет добавлять, удалять и заменять фрагменты в макете вашей деятельности.
Изменения должны быть выполнены в транзакции через FragmentTransaction
учебный класс.
Чтобы изменить фрагменты в деятельности, вы обычно определяете FrameLayout
заполнитель в файле макета.
<FrameLayout
android:id="@+id/listcontainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/detailscontainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
Вы используете FragmentManager для замены контейнера фрагментом.
// get fragment manager
FragmentManager fm = getFragmentManager();
// add
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.your_placehodler, new YourFragment());
// alternatively add it with a tag
// trx.add(R.id.your_placehodler, new YourFragment(), "detail");
ft.commit();
// replace
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.your_placehodler, new YourFragment());
ft.commit();
// remove
Fragment fragment = fm.findFragmentById(R.id.your_placehodler);
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment);
ft.commit();
Новый фрагмент заменяет существующий фрагмент в этом контейнере.
Если вы хотите добавить транзакцию в бэкстек Android, вы используете addToBackStack()
метод. Это добавит действие в стек истории действия, т. Е. Позволит отменить изменения фрагмента с помощью кнопки "Назад".