我实现了从RecyclerView中的图像到新Fragment中的图像之间的共享元素转换.RecyclerView托管在由Activity托管的片段中,目标片段托管在另一个Activity中.
当我点击我的图像时,过渡就像预期的那样发生,我进入了我的片段.但是,当我单击后退按钮时,转换尝试将我的图像放在我的RecyclerView的第一个位置,而它当前正在显示不一定是第一个的图像.
从这种情况来看,我认为因为它是一个图像列表,我在其中设置了XML内的转换名称,也许在返回时,因为所有图像都具有相同的转换名称,所以该过程混淆并且只获得给定的第一个图像名称.所以也许我应该动态地给每个人提供一个不同的过渡名称.我还为目标图像设置了相同的名称,并在每次选择新图像时重置它.但它仍然无法正常工作.任何人都可以帮助我吗?
这是我的onItemClickListener中的代码:
mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
@Override
public void onItemClick(View view, int position) {
final RssItem item = mAdapter.getItem(position);
final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
// mRootView is the view of the fragment
final ImageView image = (ImageView)
mRootView.findViewById(R.id.rss_element_image);
image.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + position);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), image, RssElementFragment.EXTRA_IMAGE);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
});
Run Code Online (Sandbox Code Playgroud)
以下是目标片段中的代码:
rssImage.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + getArguments().getInt(ARG_ELEMENT_POSITION));
ViewCompat.setTransitionName(rssImage, EXTRA_IMAGE);
Run Code Online (Sandbox Code Playgroud)
这是themes.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/theme_primary</item>
<item name="colorPrimaryDark">@color/theme_primary_dark</item>
<item name="android:colorAccent">@color/theme_accent</item>
<!-- enable …Run Code Online (Sandbox Code Playgroud) android android-fragments android-5.0-lollipop shared-element-transition android-recyclerview
我正在使用在Android 5.0上运行的设备,minSdk即21和targetSdk22.
应用说明
我正在使用2个活动的应用程序,活动A包含GridView带有图片和文本的活动,活动B包含一个ImageView,一个TextView和一个片段.该片段包含与文本关联的图像列表.当点击活动A的图像时,有一个共享元素转换,它将图像和文本移动到活动B ImageView和TextView活动B.我还在活动A和B之间设置了淡入淡出过渡.片段被动态添加到活动B在onCreate()方法中.我设置并进入并退出到片段的转换:
MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
getFragmentManager().beginTransaction()
.add(R.id.container, myFragment, MyFragment.TAG)
.commit();
Run Code Online (Sandbox Code Playgroud)
关于片段退出转换,我使用了一个技巧,当按下后退按钮时,我用另一个片段替换片段强制它:
@Override
public void onBackPressed() {
if (myFragment.isVisible()) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new Fragment())
.commit();
}
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序的主题是一个孩子,Theme.Material所以我没有定义
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
Run Code Online (Sandbox Code Playgroud)
也不
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
Run Code Online (Sandbox Code Playgroud)
(我尝试过,它没有任何区别).
应用问题
我的问题涉及片段输入转换无法正常工作,而退出转换工作正常.我试过不同的案例:
getWindow().setEnterTransition(new Fade());
getWindow().setExitTransition(new Fade());
结果与未定义显式活动转换的结果相同.
<item name="android:windowEnterTransition">@transition/fade</item>
<item name="android:windowExitTransition">@transition/fade</item>
结果是片段将通过淡入进入并被Fragment.setEnterTransition()忽略.android android-animation android-fragments android-transitions android-5.0-lollipop
android ×2