小编lcw*_*_gg的帖子

共享元素转换没有预期的行为

我实现了从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

7
推荐指数
1
解决办法
7430
查看次数

Fragment进入转换的问题

我正在使用在Android 5.0上运行的设备,minSdk即21和targetSdk22.

应用说明

我正在使用2个活动的应用程序,活动A包含GridView带有图片和文本的活动,活动B包含一个ImageView,一个TextView和一个片段.该片段包含与文本关联的图像列表.当点击活动A的图像时,有一个共享元素转换,它将图像和文本移动到活动B ImageViewTextView活动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)

(我尝试过,它没有任何区别).

应用问题

我的问题涉及片段输入转换无法正常工作,而退出转换工作正常.我试过不同的案例:

  • 没有明确定义的活动转换:没有进入转换,当共享元素转换正在播放时,片段已经存在.
  • 在活动A和B中使用java定义活动转换: getWindow().setEnterTransition(new Fade()); getWindow().setExitTransition(new Fade()); 结果与未定义显式活动转换的结果相同.
  • 使用XML定义活动转换: <item name="android:windowEnterTransition">@transition/fade</item> <item name="android:windowExitTransition">@transition/fade</item> 结果是片段将通过淡入进入并被Fragment.setEnterTransition()忽略.
  • 在XML中定义片段输入转换: …

android android-animation android-fragments android-transitions android-5.0-lollipop

7
推荐指数
1
解决办法
1749
查看次数