两个活动之间的共享元素转换问题

Shared Element Transition issue between two Activities

我在创建基本共享元素转换时遇到问题。从一个 activity 到下一个的过渡似乎出现故障并重现第一个 activity 而不是结果 activity.

概览:

我有两个活动:MainActivity 和 DetailActivity。

MainActivity 托管一个带有 CardView 布局的 RecyclerView。每个 cardview 位置的 onclicklistener 将对象设置为 intent extra,并启动 DetailActivity。这个基本实现到目前为止有效。

问题:

现在我正在尝试将共享元素转换引入组合中:

原文:(没有过渡动画的作品)

public void onObjectClick(View v, int position) {
    Word detailWord = mRepository.getWord(position);
    Intent i = new Intent(mContext, DetailActivity.class);
    i.putExtra(WORD_OBJECT, detailWord);
     //animateTransition(v,i);  -doesn't work
    mContext.startActivity(i);

问题方法:

private void animateTransition(View view, Intent intent){
        String transitionName = mContext.getString(R.string.transition_word);
        ActivityOptionsCompat options = ActivityOptionsCompat
                .makeSceneTransitionAnimation(
                        baseView.getActivity()
                        ,view
                        ,transitionName
                );
        mContext.startActivity(
                intent
                ,options.toBundle());
    }

当我从上面的点击方法中取消对 animateTransition(v,i) 方法的注释时,我得到了一些奇怪的行为:默认情况下,MainActivity 会淡出,但随后会重新出现。 DetailActivity 仍然从意图中加载但不可见。按后退按钮似乎什么都不做(仍然看到 MainActivity)但它停止了 DetailActivity。

到目前为止,我已经完成了以下所有操作:

Card_view_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="4dp"
    android:onClick="animateIntent"
    android:clickable="true"
    android:transitionName="@string/transition_word"
>

detail_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".DetailActivity"
    android:transitionName="@string/transition_word">

请试试这个

 private void animateTransition(View view, Intent intent){
 String transitionName = mContext.getString(R.string.transition_word);      
        Pair<View, String> pair = Pair.create((View) view, transitionName);

        ActivityOptionsCompat options = ActivityOptionsCompat
                .makeSceneTransitionAnimation(
                        MainActivity.this
                        ,pair
                );
        mContext.startActivity(
                intent
                ,options.toBundle());
    }

问题在于如何在 android 清单中声明 activity 后栈。首先,parent 和 child 活动必须声明为正确的 back-navigation:

<activity
        android:name=".ui.activity.HomeActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ui.activity.DetailActivity"
        android:launchMode="singleTask"
        android:parentActivityName=".ui.activity.HomeActivity"
        android:label="@string/app_name">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="ui.activity.HomeActivity"/>
</activity>

其次,child activity 必须具有 "singleTask" 的启动模式。我之前将其设置为 "singleInstance"。不同之处在于后者始终是其任务的唯一成员。如果您在此 child 片段上最小化您的应用程序并稍后恢复它,后退按钮将不会记住您的 parent activity。

parentactivity 导航和 sceneTransitionAnimation 都使用 singleTask launchMode 属性。