Фрагмент обратной стороны 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(); } 

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

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

Solutions Collecting From Web of "Фрагмент обратной стороны Android"

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

Инициализировать список правил

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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