2 votes

Pourquoi la transition de mon élément partagé a-t-elle cessé de fonctionner ?

Mon application avait l'habitude de faire passer un élément partagé d'un fragment à une activité. Je ne sais pas exactement quand cela a cessé de fonctionner. J'ai apporté des modifications mineures au code, mais rien qui n'affecte le code autour des transitions. La plus grande chose que j'ai faite est de mettre à jour mes bibliothèques de support en v24.2.1 (à partir de v23.3.0). Je me demande si je ne suis pas en train de négliger quelque chose de stupide, ou si le changement de bibliothèque de support a fait quelque chose. Les extraits de code pertinents suivent :

Le code qui démarre la transition de l'élément partagé :

public void PreviewClicked(object sender, EventArgs e)
{
    var intent = new Intent(Activity, typeof(RoutineActivity));
    intent.PutExtra(RoutineBundleKeys.BLOB_ID, _selectedBlobId.ToString());
    intent.PutExtra(RoutineBundleKeys.ROUTINE_TITLE, _selectedTitle);
    intent.PutExtra(RoutineBundleKeys.ROUTINE_HTML, ViewModel.Html);

    if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
    {
        _selectedPreview.TransitionGroup = true;
        ActivityOptionsCompat options = ActivityOptionsCompat.MakeSceneTransitionAnimation(Activity, 
                                                                                           _selectedPreview, 
                                                                                           "webview_preview_transition");
        StartActivity(intent, options.ToBundle());
    }
    else
    {
        StartActivity(intent);
    }
}

Et l'élément XML qui est partagé (_selectedPreview dans l'extrait ci-dessus) :

<WebView
    android:id="@+id/routine_preview"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:gravity="center_vertical"
    android:scrollbars="none"
    android:transitionName="webview_preview_transition" />

La méthode OnCreate dans l'activité de finition :

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    SetContentView(Resource.Layout.routine_activity_layout);

    _routineTitle = Intent.GetStringExtra(RoutineBundleKeys.ROUTINE_TITLE);

    var titleToolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.doc_title_toolbar);
    SetSupportActionBar(titleToolbar);
    SupportActionBar.Title = _routineTitle;

    _htmlString = Intent.GetStringExtra(RoutineBundleKeys.ROUTINE_HTML);

    if (_htmlString != null)
    {
        _routineView = FindViewById<WebView>(Resource.Id.routine_frame);

        if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
        {
            _routineView.TransitionGroup = true;
        }

        _routineView.Settings.BuiltInZoomControls = true;
        _routineView.Settings.DisplayZoomControls = false;

        string mimeType = "text/html";
        string encoding = "UTF-8";
        _routineView.LoadDataWithBaseURL("", _htmlString, mimeType, encoding, "");
    }
    else
    {
        var blobIdString = Intent.GetStringExtra(RoutineBundleKeys.BLOB_ID);
        _blobId = new Guid(blobIdString);

        RoutineFragment routineFragment = new RoutineFragment(_blobId);
        SupportFragmentManager.BeginTransaction().Replace(Resource.Id.routine_frame, routineFragment).Commit();
    }
}

Et le XML pour cette activité :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nothing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000"
    android:orientation="vertical">

  <android.support.v7.widget.Toolbar
      android:id="@+id/doc_title_toolbar"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="?attr/colorPrimary"
      android:elevation="4dp"
      android:minHeight="?attr/actionBarSize"
      app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

  <WebView
      android:id="@+id/routine_frame"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:transitionName="webview_preview_transition" />
</LinearLayout>

Dans mon thème de base, j'ai <item name="android:windowContentTransitions">true</item>

Je ne sais pas quel est le problème. Il semble que tout soit bien configuré.

0voto

Jason Toms Points 95

EDIT 02 Feb 2017 : Les développeurs de Xamarin ont confirmé qu'il s'agit bien d'un bug.

Je n'ai jamais réussi à le faire fonctionner, mais je pense qu'il s'agit peut-être d'un bug de Xamarin. J'ai trouvé ce bug sur le traqueur de problèmes AndroidSupportComponents. Apparemment, il a été trouvé dans la rc1 de la bibliothèque de support mais je ne vois pas de réponse des développeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X