Замена фрагмента показывает два фрагмента - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь заменить фрагмент в моем основном макете.

В моем основном макете у меня есть:

<fragment
        android:id="@+id/frame_informations"
        android:name="GridFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginStart="2dp"
        android:layout_marginEnd="2dp"
        app:layout_constraintBottom_toTopOf="@+id/main_bottom_menu"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/llLit"/>

Когда я хочу заменить этот фрагмент, я использую:

 public void switchFrameInformations(Fragment newFragment) {
            try {

                FragmentTransaction ft = fm.beginTransaction();
               // ft.setCustomAnimations(android.R.anim., android.R.anim.fade_out);
                if (fm.findFragmentById(R.id.frame_informations) == null) {
                    ft.add(R.id.frame_informations, newFragment);
                } else {
                    ft.replace(R.id.frame_informations, newFragment);
                }
              //  ft.addToBackStack(null);
                ft.commit();
                fm.findFragmentById(R.id.frame_informations).getView().requestLayout();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

fm - менеджер фрагментов ...

Это работает, но происходит нечто странное: новый фрагмент содержит список имен, а фон прозрачный.В конце замены я вижу старый фрагмент на фоне нового ...

В консоли отладки я вижу, что все методы обычно называются: onDestroy и т. Д ...для старого фрагмента.Я догадался, что имя в описании XML может вызвать проблемы:

android:name="GridFragment"

Но я не могу скомпилировать, если нет имени ...

Насколько я думаю, этоРаспространенная проблема, я пытался найти решение в Интернете, но не смог найти никакого решения.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 09 марта 2019

Замените <fragment на <FrameLayout. В вашей деятельности в onCreate добавьте следующий код

if (savedInstanceState == null) {
    fm.beginTransaction()
        .replace(R.id.frame_informations, GridFragment())
        .commit();
}

Это правильно инициализирует ваш фрагмент и позволит вам легко переключать фрагменты в коде.

...