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

String backStateName = fragment.getClass().getName();
FragmentManager fragmentManager = getSupportFragmentManager();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
 fragmentTransaction.replace(R.id.container_body, fragment);
 fragmentTransaction.addToBackStack(backStateName);
 fragmentTransaction.commit();
}

Он работает нормально и сохраняет состояние, но не показывает предыдущее изображение.

Любая помощь, предложение или учебные пособия будут очень признательны. Спасибо.

12
tech_android 6 Сен 2016 в 10:33

7 ответов

Лучший ответ

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

Инициализировать список фрагментов

  static List<String> fragments = new ArrayList<String>();

Код для изменения фрагмента и возврата в стек

   String backStateName = fragment.getClass().getName();
    FragmentManager manager = getSupportFragmentManager();
    //fragment not in back stack, create it.
    FragmentTransaction ft = manager.beginTransaction();
    if(!fragments.contains(backStateName)) {

       // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
        ft.replace(R.id.frame, fragment);
        ft.addToBackStack(backStateName);
        ft.commit();

        fragments.add(backStateName);
        System.out.println("backStateName" + fragments);
    }
    else
    {


        ft.replace(R.id.frame, fragment);
        ft.commit();

    }

onBackpressed

 @Override
public void onBackPressed() {
    if(fragments.size()>0)
        {
            fragments.remove(fragments.size()-1);
        }
        super.onBackPressed();
}

для обратного удаления стека

 final android.app.FragmentManager fm = getFragmentManager();

    fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {

            if (getSupportFragmentManager().getBackStackEntryCount() ==0) {
               // dLayout.closeDrawers();
                finish();
            }
            else
            {
               // dLayout.closeDrawers();

            }
        }
    });
1
Arjun saini 9 Сен 2016 в 10:31

Вы берете свой фрагмент в задний стек, поэтому это не ошибка вашего фрагмента, который вам нужно проверить в своей библиотеке изображений. Могу ли я узнать, какую библиотеку вы используете? Я рекомендовал использовать библиотеку Picasso. Я также использую это и получаю сохраненное состояние изображения в моем фрагменте.

http://square.github.io/picasso/

0
Jitendra ramoliya 16 Сен 2016 в 06:38

Я использовал несколько фрагментов с этим кодом. Поместите этот код в свой MainActivity, где находится ваш фрейм-макет или фрагмент.

@Override    
public void onBackPressed() {
  /*  Fragment fragment = new SettingActivity();
    String title = getString(R.string.app_name);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container_body, fragment);
    fragmentTransaction.commit();
    // set the toolbar title
    getSupportActionBar().setTitle(title);*/
    //Log.e("title:", getTitle().toString());
    getSupportActionBar().setTitle("Home");
    //Log.e("title:", getTitle().toString());
    if (!getTitle().toString().equals("Home")) {

        Fragment fragment = new Activity_category();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.container_body, fragment).commit();
        this.setTitle("Home");
    } else {

        super.onBackPressed();

    }
}

Может, это вам поможет.

0
Burhanuddin Rashid 15 Сен 2016 в 15:37

Вы можете использовать следующий код. Он не будет перезагружать фрагмент, когда вы вернетесь из предыдущего фрагмента:

    if (!fragmentPopped) {
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
     fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.container_body));
     fragmentTransaction.add(R.id.container_body, fragment);
     fragmentTransaction.addToBackStack(backStateName);
     fragmentTransaction.commit();
    }
0
nitinkumarp 9 Сен 2016 в 09:29

Если вы можете сохранить изображения в кеше диска Android при открытии фрагмента и отображении изображений путем чтения из кеша диска, это может решить вашу проблему. Следуйте приведенной ниже ссылке от Google, чтобы узнать, как сохранять изображения в кеш-памяти диска.

https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

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

  1. Храните изображения в кеше диска.
  2. onAttaching your ImagesFragment к Activity считывает изображения из кеша диска и показывает их
  3. когда фрагмент извлекается из бэкстека, ваш код автоматически считывает изображения из кеша диска.

Надеюсь это поможет.

0
Avinash4551 15 Сен 2016 в 15:12

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

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
     hideLastFragment(fragmentTransaction);
     fragmentTransaction.add(R.id.profile_fragmentContainer, youfFragment, fragmentTagName).addToBackStack(fragmentTagName);
     fragmentTransaction.commitAllowingStateLoss();

    /**
         * To hide the last fragment
         *
         * @param fragmentTransaction FragmentTransaction
         */
        public void hideLastFragment(FragmentTransaction fragmentTransaction) {
            final int backStackCount = getSupportFragmentManager().getBackStackEntryCount() - 1;
            if (backStackCount >= 0) {
                String fragmentName = getSupportFragmentManager().getBackStackEntryAt(backStackCount).getName();
                Fragment lastFragment = getSupportFragmentManager().findFragmentByTag(fragmentName);
                fragmentTransaction.hide(lastFragment);
            }
        }
0
Naveen Kumar M 16 Сен 2016 в 07:21

Ты можешь использовать

fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.frame_container));
fragmentTransaction.add(R.id.frame_container, fragment);
fragmentTransaction.addToBackStack(null);

Вместо того

fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.addToBackStack(backStateName);
0
Ramesh Kumar 9 Сен 2016 в 09:36