两个活动之间的共享元素转换问题
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。
到目前为止,我已经完成了以下所有操作:
在我的 styles.xml
中启用 window 内容转换
引用 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">
请试试这个
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 属性。
我在创建基本共享元素转换时遇到问题。从一个 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。
到目前为止,我已经完成了以下所有操作:
在我的 styles.xml
中启用 window 内容转换
引用 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">
请试试这个
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 属性。