【问题标题】:Shared Element Transition issue between two Activities两个活动之间的共享元素转换问题
【发布时间】:2015-09-18 11:10:18
【问题描述】:

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

概述:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      请试试这个

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

      【讨论】:

      • 稍作修改也会出现同样的问题。我认为仅当您想要转换多个视图时才指定一对...在这种情况下,我只是试图让 MainActivity 的 cardView 转换到 DetailActivity。
      • 虽然这篇文章是一个宝贵的资源,但我仍然不明白问题出在哪里。我一定是错过了什么......
      猜你喜欢
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      相关资源
      最近更新 更多