Empêchez complètement les transitions d'activité d'interférer avec les transitions d'éléments partagés:
Sur l'activité en cours, appelez getWindow (). SetExitTransition (null);
Sur l'activité d'entrée, appelez getWindow (). SetEnterTransition (null);
Sur https://stackoverflow.com/a/34907685/967131
Je soupçonne que cela peut avoir des effets secondaires, mais je ne sais pas avec certitude. C'est très simple et fonctionne bien.
Empêcher des éléments spécifiques de clignoter:
J'ai commencé avec la réponse d'Alex Lockwood et j'ai fait pas mal d'expérimentation pour essayer de la faire fonctionner. Le cœur de celui-ci est correct, même si je n'avais pas besoin du code qu'il suggère pour l'activité de réception, mais j'ai rencontré des problèmes en l'appelant dans un fragment (au lieu d'une activité) et en définissant une barre d'outils comme barre d'action.
Oh, la chose Fragment? J'ai vu beaucoup de commentaires qui essayaient de récupérer des références à la barre d'état et à la barre de navigation étaient nulles. La même chose m'est arrivée aussi, jusqu'à ce que je réalise que je ne les trouverais pas dans la mise en page du Fragment ... elles étaient au-dessus de ce niveau. Par conséquent, le code ci-dessous pour obtenir la vue décorative de l'activité et la rechercher. Ensuite, je les ai trouvés sans problème.
Au final, j'ai développé cette méthode utilitaire:
public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return null;
}
View decorView = activity.getWindow().getDecorView();
View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
View transitionView = decorView.findViewById(transitionViewResId);
String transitionName = activity.getString(transitionNameResId);
List<Pair<View, String>> pairs = new ArrayList<>();
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
if (appBarLayout != null) {
pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
}
pairs.add(Pair.create(transitionView, transitionName));
//noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
.toBundle();
}
Remarque R.string.transition_appbarlayout et R.id.appbarlayout . Ces ID sont arbitraires, tant qu'ils correspondent à ce que votre code utilise. Dans mon XML, je mets en page la barre d'actions personnalisée comme ceci (éditée jusqu'à l'essentiel):
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:id="**@+id/appbarlayout**"
android:transitionName="**@string/transition_appbarlayout**">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>
Si vous n'utilisez pas une barre d'outils comme celle-ci, cette partie peut être supprimée de la méthode utilitaire.
Ensuite, vous l'appelleriez dans votre Fragment comme ceci:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
En utilisant les valeurs que vous voulez, tant qu'elles correspondent à votre XML.
Cela empêche la barre d'état, la barre d'outils et la barre de navigation (boutons retour / accueil / applications récentes) de clignoter pendant la transition. Le reste de la transition d'activité est normal.
Dans mon cas, notre thème d'application a un android:windowBackground
bleu. Cela provoque un flash bleu dans la transition, ce qui est assez frustrant. Mais plutôt que de faire un changement qui affecte toute l'application comme ça, pour l'instant je vais avec la première option, rapide et sale.