Операции фрагмент с переходом - требуется уникальная transitionNames являются

Я хочу перейти от представления списка к подробному представлению, и поэтому я использую следующее OnClickListener в моем списке:

@Override
public void onClick(View view)
{
    Bet bet = (Bet)view.getTag();
    FragmentManager fm = getActivity().getSupportFragmentManager();
    BetDetailFragment f = BetDetailFragment.create(bet);
    String tag = f.getClass().getName();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
        f.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
    }

    FragmentTransaction ft = fm.beginTransaction()
            .replace(R.id.frame_container, f, tag)
            .addToBackStack(tag);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo1(bet) + "|" + view.findViewById(R.id.ivLogo1));
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo2(bet) + "|" + view.findViewById(R.id.ivLogo2));
        ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");//TransitionUtil.getTransitionNameBetLogo1(bet));
        ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");//TransitionUtil.getTransitionNameBetLogo2(bet));
    }
    ft.commit();
}

мои функции возвращают уникальные имена, у меня есть два разных мнения, но все равно не работает. Я уже прокомментировал ненужные функции и написал несколько уникальных имен транзакций вручную... Но все же я получаю это исключение, в строке first addSharedElement:

java.lang.IllegalArgumentException: Unique transitionNames are required for all sharedElements
        at android.support.v4.app.BackStackRecord.addSharedElement

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

без общих элементов, все работает отлично...

5 ответов


проблема в том, что addSharedElement не устанавливает имя транзакции представления!

поэтому в моем примере мне пришлось бы установить его со следующим кодом:

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "1");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "2");

прежде чем я добавлю это представление в FragmentTransaction...

после этого следующие работы просто отлично и как ожидалось:

ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");
ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");

вам нужно только установить transitionName на общий элемент. нет необходимости выбирать его точно равным имени вашего общий элемент (это было передано как второй аргумент addSharedElement() метод).

это имя (второй параметр addSharedElement()) должно быть равно transitionName на общий элемент на фрагмент пунктом. Видеть здесь.


так достаточно вставить:

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "AnyThing");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "EveryThing");

перед вызовом addSharedElement(...).


вы должны установить одно и то же имя transitionName в элементе макета xml каждого фрагмента. Например:

Фрагмент A:

<TextView
 android:id="@+id/my_text_view"
 ...
 android:transitionName="transtion_name_example"/>

Фрагмент B:

<TextView
 android:id="@+id/my_text_view"
 ...
 android:transitionName="transtion_name_example"/>

и код будет примерно таким:

yourTransaction.addSharedElement(view, view.transactionName)

Если onClickListener является частью вашего фрагмента, а не родителем Activity, тогда вы делаете что-то неправильно здесь. Ваш фрагмент должен уведомлять родительскую активность о том, что она хочет, и Activty должен иметь дело с ней (т. е. путем замены фрагментов и т. д.). Фрагмент не должен делать этого сам. Также, если все, что вам нужно, это перейти от подробного представления к списку, то я предполагаю, что вы ввели свое подробное представление из этого списка. Если это так, все, что вам нужно, это вытащить последний элемент (фрагмент вида фрагмента) из заднего стека. Видеть: https://developer.android.com/reference/android/app/FragmentManager.html


перед onClick

используйте этот код

ViewCompat.setTransitionName(holder.ivImage, "value");