Сохранить состояние фрагмента при использовании нижней навигации - PullRequest
0 голосов
/ 03 ноября 2018

Я использую bottom navigation drawer для переключения между фрагментами, проблема в том, что каждый раз, когда я возвращаюсь к фрагменту, он воссоздается.

Как сохранить состояние фрагмента и возобновить его при переключении на него?

        bottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener(){
            @Override
            public void onTabSelected(int position) {
                if (position==0){
                    loadFragment(new Daily());
                }
                if (position==1){
                    loadFragment(new Trending());

                }
                if (position==2){
                    loadFragment(new Random());
                }
            }
            @Override
            public void onTabUnselected(int position) {

            }
            @Override
            public void onTabReselected(int position) {
            }
        });

 private void loadFragment(Fragment fragment) {
    // load fragment
    FragmentTransaction transaction = 
    getSupportFragmentManager().beginTransaction();
    transaction.attach( fragment);
    transaction.addToBackStack(null);
    transaction.commit();


}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Проблема в том, что вы всегда создаете новый Fragment для любого onTabSelected. Поэтому, чтобы это исправить, вам нужно поработать с вашим FragmentManager.

Возможное решение: используйте методы add и show/hide.

Пример:

private static final String DAILY_TAG = BuildConfig.APPLICATION_ID + ".DAILY_TAG";
private static final String TRENDING_TAG = BuildConfig.APPLICATION_ID + ".TRENDING_TAG";
private static final String RANDOM_TAG = BuildConfig.APPLICATION_ID + ".RANDOM_TAG";

public void onTabSelected(int position) {
    FragmentManager fragmentManager = getSupportFragmentManager();

    if (position == 0) {
        hideFragment(TRENDING_TAG)
        hideFragment(RANDOM_TAG)

        Fragment fragment = fragmentManager.findFragmentByTag(DAILY_TAG);
        FragmentTransaction transaction = fragmentManager.beginTransaction()

        if (fragment != null) {
            transaction.show(fragment)
        } else {
            transaction.add(content.id, new Daily(), DAILY_TAG)
        }

        transaction.commitNow()

    } else if (position == 1) {
        hideFragment(DAILY_TAG)
        hideFragment(RANDOM_TAG)

        Fragment fragment = fragmentManager.findFragmentByTag(TRENDING_TAG);
        FragmentTransaction transaction = fragmentManager.beginTransaction()

        if (fragment != null) {
            transaction.show(fragment)
        } else {
            transaction.add(content.id, new Trending(), TRENDING_TAG)
        }

        transaction.commitNow()

    } else {
        hideFragment(TRENDING_TAG)
        hideFragment(DAILY_TAG)

        Fragment fragment = fragmentManager.findFragmentByTag(RANDOM_TAG);
        FragmentTransaction transaction = fragmentManager.beginTransaction()

        if (fragment != null) {
            transaction.show(fragment)
        } else {
            transaction.add(content.id, new Random(), RANDOM_TAG)
        }

        transaction.commitNow()
    } 

    fragments.put(position, fragment);

    loadFragment(fragment);
}

private void hideFragment(String tag) {
    FragmentManager fragmentManager = getSupportFragmentManager()
    Fragment currentFragment = fragmentManager.findFragmentByTag(tag)

    if (currentFragment != null) {
        fragmentManager.beginTransaction().hide(currentFragment).commitNow()
    }
}

PS - код можно оптимизировать.

0 голосов
/ 03 ноября 2018

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

private Map<Integer, Fragment> fragments = new HashMap<>();


bottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener(){
    @Override
    public void onTabSelected(int position) {
        Fragment fragment = fragments.get(position);

        if (fragment == null){
            if (position == 0) {
                fragment = new Daily();
            } else if (position == 1) {
                fragment = new Trending();
            } else {
                fragment = new Random();
            } 

            fragments.put(position, fragment);
        }

        loadFragment(fragment);
    }
    @Override
    public void onTabUnselected(int position) {

    }
    @Override
    public void onTabReselected(int position) {
    }
});
...