9

Я хочу, чтобы перейти от просмотра списка к детальному и поэтому я использую следующие OnClickListener в моем списке:Фрагмент Операции с переходным - Уникальными transitionNames требуется

@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(); 
} 

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

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

EDIT

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

ответ

23

Проблема заключается в том, что 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"); 
+0

Большое вам спасибо за это! –

0

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

+0

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

0

перед тем OnClick

использовать это сотрудничество de

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

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

  • Нет связанных вопросов^_^