Фрагмент не работает с использованием фрагмента тега, работает в 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() метод. Это добавит действие в стек истории действия, т. Е. Позволит отменить изменения фрагмента с помощью кнопки "Назад".

Другие вопросы по тегам