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

时间:2015-09-18 11:10:18

标签: android android-intent android-activity shared-element-transition

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

概述:

我有两个活动: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());
    }

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

到目前为止,我已完成以下操作以解决所有问题:

  • 在styles.xml中启用了窗口内容转换

  • 在我的风格中引用my_transition.xml作为退出转换

    @过渡/ my_transition

  • 为cardView(由RecyclerView使用,在activity_home.xml RelativeLayout中引用)中的共享元素提供了android:transitionName

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

2 个答案:

答案 0 :(得分:2)

问题是如何在android清单中声明活动backstack。首先,必须声明父子活动以进行适当的反向导航:

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

其次,子活动必须具有“singleTask”的启动模式。我以前把它设置为“singleInstance”。不同之处在于后者始终是其任务的唯一成员。如果您在使用此子片段时最小化应用程序并在以后恢复它,则后退按钮将不会记住您的父活动。

父活动导航和sceneTransitionAnimation都使用singleTask launchMode属性。

答案 1 :(得分:1)

请尝试使用此

 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());
    }