2015-02-18 2 views
0

У меня проблема с поведением задней части. Это то, что я делаю:Предварительная загрузка фрагмента, когда popBackStack

add(fragment1) + addToBackStack(null) 
replace(fragment2) + addToBackStack(null) 

Что происходит: добавлено

  • Фрагмент 1 и в backstack
  • Затем второй фрагмент заменяет первый и добавляется к backstack ,

Теперь я хочу изменить свой последний backstacked фрагмент с новой сделкой, поставить новый фрагмент backstack так:

[frag1, frag2] becomes [frag1, frag3] 

, но эта сделка, заключенная на popBackStack + replace делает в frag1 для загрузки путем вызова его onCreateView и onActivityCreated. Я знаю, что это ожидаемое поведение, потому что так работает backstack, но я пытаюсь найти способ избежать этой предварительной загрузки.

Редактировать

В этом вопросе я использую понятие фрагмента backstack для транзакции, чтобы быть более ясным. Каждая транзакция здесь представляет собой add + remove (которая является заменой). Код для замены я использую:

public int replaceFragment(BaseFragment newFragment, boolean addToBackStack, boolean animated, PopStackMode popMode) { 
    if (popMode != null) { 
     getSupportFragmentManager().popBackStack(newFragment.getFragmentTag(), popMode == PopStackMode.POP_INCLUSIVE ? FragmentManager 
       .POP_BACK_STACK_INCLUSIVE : 0); 
    } 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    if (animated) { 
     ft.setCustomAnimations(R.anim.slide_in_left, 0, R.anim.slide_out_right, 0); 
    } 
    ft.replace(R.id.fragment_container, newFragment, newFragment.getFragmentTag()); 
    if (addToBackStack) { 
     ft.addToBackStack(newFragment.getFragmentTag()); 
    } 
    return ft.commit(); 
} 

Вы можете видеть, что я творю навигационную историю на основе фрагмента backstack, как это было своего рода браузер. Когда добавлена ​​«страница», есть фрагмент и транзакция backstack. В этом контексте я пытаюсь:

  • Удалить текущий фрагмент.
  • Удалите транзакцию из задней части.
  • Добавить новый фрагмент без загрузки и загрузки предыдущего фрагмента backstack.

Я надеюсь, что это более понятно.

Edit 2

Я заполнил функцию запроса для флага, который поддерживает такое поведение. Найдите его here.

+1

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

+0

Если это не звучит хорошо, что произойдет, если y заменит представление родителя в контейнере, и я добавлю транзакцию в заднюю часть? Он воссоздает представление, как сейчас. Мне нужен новый контейнер поверх того, который я использую для навигации, чтобы добавить это поведение. Не так ли? – droidpl

+0

Я не совсем понял ваш вопрос, но вложенную замену ребенка не следует добавлять в задний стек. Сам контейнер будет слоем на задней панели, и ребенок будет динамически заменяться (без вмешательства в задний стек). – corsair992

ответ

0

Во-первых, вы должны понимать, что backstack не сохраняет фрагменты, но вместо этого он сохраняет transactions. Когда вы вызываете popBackStack, то, что он на самом деле делает, возвращает предыдущий transaction. Подробнее об этом here.

Я думаю, что вы можете сделать это:

  1. Имя транзакций, предоставляя уникальное имя вашей addToBackStack вместо нулевой. т.е. addToBackStack("frag1").
  2. Не звоните popBackStack + replace, но вместо этого позвоните по номеру replace.
  3. Тогда в вашей деятельности, переопределить onBackPressed и если текущий фрагмент отображается в Frag3 (вы можете проверить это с помощью findFragmentByTag если вы предоставили тег в методе replace) вы можете вызвать getSupportFragmentManager().popBackStackImmediate("frag1", FragmentManager.POP_BACK_STACK_INCLUSIVE); (иначе назвать super.onBackPressed)
+0

Насколько я знаю, это не должно работать, так как если я не буду называть popBackStack, эта транзакция останется там. Мои требования не так просты, как 2 frament, есть 7 разных фрагментов, которые могут быть там. Я фактически назначаю имя (каноническое имя класса фрагмента). Пожалуйста, взгляните на код, который я действительно использую для замены, я отредактировал ответ. – droidpl

+0

Вы правы, транзакция останется там, но поскольку вы предоставляете имя методу 'popBackStack', как вы можете видеть в [документации] (http://developer.android.com/reference/android /app/FragmentManager.html#popBackStack), он будет всплывать каждую транзакцию до тех пор, пока не будет найден тот, который вы предоставляете. В любом случае, поскольку вы признаете, что пытаетесь достичь обходного пути от ожидаемого поведения, я советую вам пересмотреть свое решение. –

+0

Проблема - это сами требования. Только одно действие, навигация с использованием фрагментов. это ужасно, но это то, чего они хотят. Поэтому я могу предположить, что нет способа избежать загрузки предыдущей транзакции или принятия всех транзакций, всплывающих из них и повторного добавления всех, кроме тех, которые я ненавижу. – droidpl

Смежные вопросы