Фрагмент Транзакция загружает пустой вид, но фрагмент отображается после вращения устройства

Я создаю ящик для навигации, как это предусмотрено документацией Google, однако у меня есть проблема, когда фрагмент не заменяется. http://developer.android.com/training/implementing-navigation/nav-drawer.html

Когда приложение загружается первым, загружается фрагмент по умолчанию. Нажатие на другой элемент в списке ящиков оставляет пустой вид Однако при вращении устройства загружается выбранный фрагмент.

public void selectNavActivty(int position){
    // TODO Changing between the different screens selection
    fragment = null;
    switch (position) {
        case 0:
            fragment = OverLay.newInstance();
            break;
        case 1: 
            fragment = Dummy.newInstance();
            break;
        }

    if(fragment != null) {
        // attach added to handle viewpager fragments
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.replace(R.id.content_frame, fragment).attach(fragment)
            .addToBackStack(null);

        trans.commit();
        getFragmentManager().executePendingTransactions();
    } else {
        Log.d("Drawer Activity","Error in creating Fragment");
    }
}

Ответ 1

Для транзакций фрагмента меню навигации я использую следующий подход, таким образом фрагмент будет добавлен и помещен сверху.

String name = "myFragment";
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment, name)
.commit();

Посмотрите функцию attach(). Он следует за другим жизненным циклом фрагмента. Также убедитесь в том, что вы можете отобразить рамку в макете.

Ответ 2

Измените свой код, как показано ниже:

if(fragment != null) {
        // attach added to handle viewpager fragments
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.replace(R.id.content_frame, fragment);
        trans.addToBackStack(null);
        trans.commit();
    } else {
        Log.d("Drawer Activity","Error in creating Fragment");
    }

Если решение не работает для вас, поделитесь xml-кодом вместе с кодом фрагмента.

Ответ 3

После добавления фрагмента он будет добавлен в состояние активности и его вид будет добавлено к определенному представлению контейнера. Но, добавив ничего, отображается, если фрагмент еще не добавлен в пользовательский интерфейс. Он просто придает менеджер фрагментов. Однако если представление уже было добавлено в контейнер в пользовательском интерфейсе и отсоединенный после этого, путем присоединения, он будет отображаться снова в его контейнере. Наконец, вы можете использовать прикрепление и отсоединение, если хотите уничтожить фрагмент Просмотр временно и хотите отобразить и построить его взгляд на будущее, не теряя своего состояния внутри деятельности.

fooobar.com/questions/261565/...

Ответ 4

Мое решение - пометить весь фрагмент уникальным тегом при замене фрагмента. Убедитесь, что вы также назначили уникальный тег для фрагмента по умолчанию во время создания. Более эффективный способ состоит в том, чтобы идентифицировать фрагмент, прежде чем воссоздать один и тот же.

public void selectNavActivty(int position){
// TODO Changing between the different screens selection

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragment = fragmentManager.findFragmentById(R.id.content_frame);
    String fragmentTag = null;
    switch (position) {
        case 0:
            fragmentTag = "case0Tag"; // please change to better tag name
            break;
        case 1: 
            fragmentTag = "case1Tag"; // please change to better tag name
            break;
        default:
            Log.d("Drawer Activity","Error in creating Fragment");
            return;
    }
    if (fragmentTag != null && !fragment.getTag().equals(fragmentTag))
    fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit();
}