Intereting Posts
Простой жизненный цикл Android-активности Android Date Time picker в одном диалоговом окне Android – результат AsyncTask, который не возвращается на главную активность Показать модальный после установки или обновления приложения SaveInBackground callback не работает Приложение не будет выполняться на новом Android Studio 2.2 с градиентом 2.14.1 с включенным Instant Run Курсор Edittext невидим в android 4.0 Выполнение запроса HTTPS с использованием Android Volley Как получить динамический динамический идентификатор дочернего вида с щелчком мыши на LinearLayout? Как нарисовать наложение на SurfaceView, используемое камерой на Android? Как начать другое действие с некоторой задержкой после нажатия кнопки в android? Как исправить «OutOfMemoryError: java heap space» при компиляции приложения MonoDroid в MonoDevelop Как я могу узнать, что onCreateView был вызван из внешнего класса? Как добавить несколько параметров одного и того же массива с помощью Retrofit? Как обращаться с: java.util.concurrent.TimeoutException: android.os.BinderProxy.finalize () вышло после 10 секундных ошибок?

PopBackStack вызывает вызовы oncreateView фрагмента снова и снова

У меня есть 3 фрагмента A, B, CI написал фрагмент кода для их замены и поддержки backstack:

public void addFragment(Fragment fragmentToAdd, String fragmentTag) { FragmentManager supportFragmentManager = getSupportFragmentManager(); Fragment activeFragment = getActiveFragment(); FragmentTransaction fragmentTransaction = supportFragmentManager .beginTransaction(); if (null != activeFragment) { fragmentTransaction.hide(activeFragment); } fragmentTransaction.replace(R.id.layout_child_activity, fragmentToAdd, fragmentTag); if (supportFragmentManager.getBackStackEntryCount() > 1) { supportFragmentManager.popBackStack(); } fragmentTransaction.addToBackStack(fragmentTag); fragmentTransaction.commit(); } 

Здесь в этом фрагменте кода

 if (supportFragmentManager.getBackStackEntryCount() > 1) { supportFragmentManager.popBackStack(); } 

Я использую для всплытия последний фрагмент, если длина стека больше 1. Теперь из-за этого, когда длина больше 1, она снова и снова вызывает представление WithCreate. Подобно :

  1. Открыть A.
  2. Открыть B.
  3. Открыть C. (В случае открытия C. onCreateView для A называется.)

Почему я получаю такое поведение? Когда я удаляю этот курсив, чем это не происходит.

Solutions Collecting From Web of "PopBackStack вызывает вызовы oncreateView фрагмента снова и снова"

Чем поведение нормальное, исходя из транзакции backstack, как говорится в документах. Backstack, никогда не сохраняет фрагменты, он просто сохраняет транзакцию

Введите описание изображения здесь

http://developer.android.com/intl/es/guide/components/fragments.html

Что я делаю, я не уверен, если это лучший способ, но когда я хочу очистить все транзакции, я делаю это

1) ВНУТРИ ВАШЕЙ ДЕЯТЕЛЬНОСТИ проверьте, есть ли какие-либо транзакции в заднем стеке и добавьте флаг внутри вашего фрагмента, в вашем случае это A

  int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); if(backStackCount > 0) { Transactions.MUST_DETACH_FROM_BACKSTACK = true; getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } 

2) Внутри фрагмента A получите флаг и удалите fragent onCreateView и верните нуль, как это

 public class Transactions extends android.support.v4.app.Fragment{ public static boolean MUST_DETACH_FROM_BACKSTACK = false; public Transactions() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i("FRAGMENT", "onCreateView "+MUST_DETACH_FROM_BACKSTACK); // Inflate the layout for this fragment if (MUST_DETACH_FROM_BACKSTACK) { MUST_DETACH_FROM_BACKSTACK = false; getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); return null; } return inflater.inflate(R.layout.fragment_transactions, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Log.i("FRAGMENT", "onViewCreated"); if(view != null){ Log.i("FRAGMENT", "ThreadStarted"); startThread(view); } } 

НО БУДЬТЕ ОСТОРОЖНЫ i Get onResume () Вызывается после

 OnCreateView() 

Даже с getActivity (). GetSupportFragmentManager (). BeginTransaction (). Remove (this) .commit ();

Поэтому, если у вас есть какой-либо метод conde onResume, вы должны справиться с ним