17

Новые переходы с использованием общих элементов работают, когда я использую фрагмент 'replace', но я не могу заставить его работать с фрагментом 'добавить'. Я использую один и тот же контейнер в обоих случаях.Работа с разделяемыми элементами работает с FragmentTransaction.replace(), но не работает с FragmentTransaction.add()

Подробнее:

Активность - layout->

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00ffff" 
    android:orientation="vertical" > 

</FrameLayout> 

О запуске деятельности, добавить Fragment1 к экрану

getFragmentManager().beginTransaction().replace(R.id.container,new TransitionTestFragment1(), "TransitionTestFragment1").commit(); 

На событие щелчка для view в макете Fragment1 -> Я добавляю Fragment2 на экран. Я поставил слушателя в onCreateView первого фрагмента

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
final TransitionSet transitionSet = new TransitionSet(); 
transitionSet.addTransition(new ChangeImageTransform()); 
transitionSet.addTransition(new ChangeBounds()); 
transitionSet.addTransition(new ChangeTransform()); 
transitionSet.setDuration(300); 

View v=inflater.inflate(R.layout.fragment1, null); 
final View image=v.findViewById(R.id.image); 
image.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     setSharedElementReturnTransition(transitionSet); 
     Fragment fragment = new TransitionTestFragment2(); 
     fragment.setSharedElementEnterTransition(transitionSet); 

     FragmentTransaction ft = getFragmentManager().beginTransaction() 
       .replace(R.id.container, fragment) 
       .addToBackStack("transaction") 
       .addSharedElement(image, "MyTransition"); 
     ft.commit(); 

    } 
}); 
return v; 

}

У меня есть этот вид изображения в макетах обоих фрагментов

<ImageView 
     android:layout_width="300dp" 
     android:layout_height="300dp" 
     android:src="@drawable/ic_launcher" 
     android:transitionName="MyTransition" /> 

Теперь переход не работает, если я использую FragmentTransaction.add() для добавления второго фрагмента, но он работает, если вместо этого я использую FragmentTransaction.replace(). Как я могу заставить его работать с add()? Это вообще возможно?

+0

Даже я столкнулся с этой проблемой ... Вы нашли решение? –

ответ

2

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

В моем answer (где вы прокомментировали) Я добавил переход ввода и выхода. Если вы добавите его, разве это даже оживить? Если нет, это, вероятно, из-за заявленной причины.

+0

Нет, он не оживляет, когда я добавляю его в соответствии с вашим ответом. Я подумал, что это будет причиной. Есть ли у вас какие-либо идеи для работы? В любом случае я мог бы сделать эту работу без необходимости прибегать к изменению «добавить» на «заменить»? Спасибо за ответ в любом случае. –

+0

Я бы не знал. Я бы сказал, что это невозможно, поскольку система основана на «возвращении» представления. Я предполагаю, что вы хотите оставить все взгляды в своем старом фрагменте, как есть, и «повторно использовать» один вид в новом фрагменте. Не знаю, насколько сложным является ваш новый фрагмент, иначе я бы поместил все в макет «старого» фрагмента, анимируя его сам. Но иногда лучше идти на уступки (технический или дизайн) и либо не анимировать представление, либо иметь причудливые анимации, ни «видимый стек». Если старый фрагмент не остается видимым, зачем использовать add и не заменять? – ar34z

+1

думаю, что это невозможно тоже. Ищете окончательный ответ, чтобы я мог двигаться дальше.Причина, почему я не хочу использовать замену, состоит в том, что старый фрагмент выполняет тяжелую работу (загружает значительно больший объем данных для отображения, имеет несколько горизонтальных прокрутки), когда он инициализируется .. из-за чего onSaveInstanceState/onRestore .. не достаточно гладко .. в то время как если я просто использую add, все работает плавно (поскольку ничего не выгружается из основной памяти) –

-1

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

для толкания:

fragmentTransaction.add(R.id.content, fragment); 
    if (fragments.size() > 0) { 
     UIBaseFragment lastElement = fragments.lastElement(); 
     fragmentTransaction.hide(lastElement); 
    } 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
    fragments.push(fragment); 

Тогда поп таким образом

final FragmentManager manager = getChildFragmentManager(); 
    manager.popBackStack(); 
    fragments.pop(); 
+0

Пожалуйста, попробуйте объяснить свой код, и этот код не работает. – extmkv