Android: переход общего элемента с фрагментами

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

У меня есть активность под названием TimelineActivity, и у меня есть 2 фрагмента: ListFragment, который динамически добавляется в TimelineActivity, и DetailFragment.

Всякий раз, когда я нажимаю элемент в ListView в ListFragment, фрагмент заменяется на DetailFragment.

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    DetailFragment fragment = DetailFragment.newInstance();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        fragment.setSharedElementEnterTransition(new ChangeBounds().setDuration(2000));
        fragment.setEnterTransition(new ChangeBounds().setDuration(2000));
        setExitTransition(new ChangeBounds().setDuration(2000));
        fragment.setSharedElementReturnTransition(new ChangeBounds().setDuration(2000));
    }

    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();

    fragment.setAllowEnterTransitionOverlap(true);
    fragment.setAllowReturnTransitionOverlap(true);

    ft.replace(R.id.timeline_container, fragment);
    ft.addSharedElement(view.findViewById(R.id.transition), "selectClientTransition");
    ft.addToBackStack(null);

    // Start the animated transition.
    ft.commit();
}

В моем listview_row.xml, который является макетом списка, который у меня есть:

   <LinearLayout
   android:id="@+id/transition"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#FFF"
   android:orientation="vertical"
   android:padding="10dp"
   android:transitionName="selectClientTransition">
   </LinearLayout>

и в моем fragment_detail.xml у меня есть следующее:

<LinearLayout
                android:id="@+id/transition"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#FFF"
                android:orientation="vertical"
                android:padding="10dp"
                android:transitionName="selectClientTransition"
                android:weightSum="12">
</LinearLayout>

Я добавил это в свою AppTheme

<item name="android:windowContentTransitions">true</item>

Просто для ясности: фрагменты заменены, это работает нормально, но без эффекта изменения границ. Я действительно застрял здесь, так что все приветствуется.

заранее спасибо


person jeroenvdbergh    schedule 08.11.2016    source источник


Ответы (2)


Вам необходимо установить уникальное имя перехода для каждого элемента в списке. Вот пример:

в методе getView адаптера задайте имя перехода:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // your code...

    sharedView.setTransitionName("transition_name_" + position);
}

в методе onItemClick отправьте имя перехода в DetailFragment:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    DetailFragment fragment = DetailFragment.newInstance();
    View sharedView = v.findViewById(R.id.shared_view);

    Bundle arguments = new Bundle();
    arguments.putString(DetailFragment.TRANSITION_NAME, sharedView.getTransitionName());
    fragment.setArguments(arguments);

    // the rest of your code (replacing fragments, etc)...
}

в методе DetailFragment onCreateView установите имя перехода для просмотра:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // your code...

    View sharedView = inflatedLayout.findViewById(R.id.shared_view);
    sharedView.setTransitionName(getArguments().getString(TRANSITION_NAME))
}
person Erdenian    schedule 26.02.2018

Я только что узнал, что это происходит только тогда, когда я использую пользовательский адаптер массива с более чем 1 элементом в нем, если я переключаюсь на обычный массив строк для моего ListView, все работает нормально, то же самое, если у меня есть только 1 элемент в моем списке с кастомный arrayadapter, все работает нормально.

person jeroenvdbergh    schedule 08.11.2016