2

Я работаю над проектом, где мне нужен переход между фрагментами с использованием общих элементов. Я пробовал почти все, но эффект перехода не работает.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 который макет для ListView У меня есть:

<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> 

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

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

ответ

0

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

0

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

имени GetView метод набора переходного адаптера:

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

    sharedView.setTransitionName(String.valueOf("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)... 
} 

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

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

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

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