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