2

Je travaille sur un projet où j'ai besoin d'une transition entre des fragments en utilisant des éléments partagés. J'ai essayé presque tout mais l'effet de transition ne fonctionne pas.Android: Transition d'éléments partagés avec des fragments

J'ai une activité appelée TimelineActivity et j'ai 2 fragments, un ListFragment qui est dynamiquement ajouté à l'TimelineActivity et un DetailFragment.

Chaque fois que je clique sur un élément dans ListView dans le ListFragment, le fragment est remplacé par le 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(); 
} 

Dans mon listview_row.xml qui est la mise en page pour le listview je:

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

et dans mon fragment_detail.xml je les suivantes:

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

J'ai ajouté cette à mon AppThème

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

Juste pour être clair, les fragments sont remplacés, cela fonctionne bien, mais sans effet changebounds. Je suis vraiment coincé ici donc tout est bienvenu.

Merci à l'avance

Répondre

0

Je viens de découvrir que ce ne se produit que lorsque j'utilise une coutume arrayadapter avec plus de 1 élément, si je passe à un tableau normal de cordes pour mon ListView, tout fonctionne bien, même si je n'ai qu'un seul élément dans ma listview avec un arrayadapter personnalisé, tout fonctionne correctement.

0

Vous devez définir un nom de transition unique pour chaque élément de la liste. Voici un exemple:

au nom méthode getView de l'adaptateur jeu de transition:

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

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

dans la méthode onItemClick envoyer le nom de transition vers 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)... 
} 

dans la méthode onCreateView de DetailFragment définir le nom de la transition à la vue:

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