Фрагмент обратной стороны Android

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

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();
}

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

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

Ответ 1

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

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

  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();

            }
        }
    });

Ответ 2

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

    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();
    }

Ответ 3

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

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);

Ответ 4

Я использовал несколько фрагментов с этим кодом. Введите этот код в свой 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();

    }
}

Пусть это поможет вам.

Ответ 5

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

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

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

  • Храните изображения в кеше диска.
  • onAttaching your ImagesFragment to Activity читает изображения из кеша диска и показывает им
  • когда фрагмент выскочит из стопки, ваш код будет автоматически считывать изображения из кеша диска.

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

Ответ 6

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

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

Ответ 7

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

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);
            }
        }