3

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

概述:

我有两个活动:一个 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。

到目前为止,我已经完成了以下操作来连接所有这些:

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

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

    @transition/my_transition

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

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

2 回答 2

3

问题是如何在 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 属性。

于 2015-10-27T18:39:54.283 回答
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());
    }
于 2015-09-18T12:26:19.117 回答