碎片进入转换存在问题

9
我正在使用一台运行Android 5.0的设备,其中minSdk为21,targetSdk为22。 应用程序描述 我在一个包含两个活动的应用中,活动A包含一个带有图片和文本的GridView,而活动B包含一个ImageView、一个TextView和一个片段。该片段包含了与文本相关联的图像列表。 当点击活动A中的图像时,会出现共享元素过渡效果,将图像和文本移动到活动B的ImageViewTextView上。我还在活动A和B之间设置了淡入淡出的过渡效果。该片段是在onCreate()方法中动态添加到活动B中的。我为该片段设置了进入和退出过渡效果。
 MyFragment myFragment = new MyFragment();
 myFragment.setEnterTransition(new Slide());
 myFragment.setExitTransition(new Slide);
 getFragmentManager().beginTransaction()
                .add(R.id.container, myFragment, MyFragment.TAG)
                .commit();

关于片段退出转换,我使用了一个技巧,在按下返回按钮时,我替换片段为另一个以强制执行它。
@Override
public void onBackPressed() {
    if (myFragment.isVisible()) {
        getFragmentManager().beginTransaction()
                .replace(R.id.container, new Fragment())
                .commit();
    }
    super.onBackPressed();
}

我的应用程序的主题是 Theme.Material 的子类,所以我没有定义。
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

nor

<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>

我的问题涉及片段进入转换,它无法正常工作,而退出转换却可以正常工作。我尝试了不同的情况:

  • 没有显式定义活动转换:没有进入转换,当共享元素转换播放时,片段已经存在。
  • 在活动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中定义片段进入转换: <item name="android:fragmentEnterTransition">@transition/fade</item> 结果是完全被忽略,之前的所有情况都会发生相同的事情。

我尝试了其他方法来使它工作,例如:myFragment.setAllowEnterTransitionOverlap(false);但没有用……我还尝试在ImageView上设置点击监听器,并仅在单击图像时添加片段,它起作用了!因此,我认为片段转换的时间与活动生命周期相比可能存在问题,所以我尝试将代码放在onResume()方法中,但仍然没有用。

然后我尝试使用postDelayed()方法:

MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
mImageView.postDelayed(new Runnable() {
            @Override
            public void run() {
         getFragmentManager().beginTransaction()
            .add(R.id.container, myFragment, MyFragment.TAG)
            .commit();
            }
        }, 1000);

它也起作用了!

最后我尝试添加一个空片段,然后将其替换为 myFragment

MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
getFragmentManager().beginTransaction()
                .add(R.id.container, new Fragment)
                .commit();
getFragmentManager().beginTransaction()
                .replace(R.id.container, myFragment, MyFragment.TAG)
                .commit();

但是仍然没有任何进展...

所以我现在想知道是否有什么我错过的东西可以让它不使用技巧也能工作...问题是我知道它可以工作,因为大约5个月前我开始开发这个应用程序时它是可以工作的!!所以我不知道发生了什么事情,我没有更新我的Android版本。

额外的错误: 这仍然与片段进入转换有关。在拥有我之前描述的应用程序之前,我尝试了一个没有共享元素转换的版本。如果我不给Activity B的TextView设置转换名称,片段将永远不会有进入转换。但和之前一样,如果在onclicklistener方法中设置,它就会起作用。我在运行Android 5.0.x的2个设备上尝试了这个方法,转换没有起作用。我在一个运行Android 5.1.1的设备上尝试了一下,转换起作用了(没有改变代码中的任何内容)!仍然不知道发生了什么...

所以我的最终问题是:这种行为的解释是什么,有没有办法使它不使用技巧也能工作?


1
我想我陷入了类似的问题。唯一的区别是我卡在了退出转换中。你解决了这个问题吗? - Udayaditya Barua
1
同样的问题,对我来说使用onCreate并不是答案,因为我正在将一些滑动转换添加到RecyclerView和一个视图中的圆形显示。我的问题是当我有appbarLayout时,进入转换不起作用,如果我删除它,然后它开始工作。我还没有见过像这样的具有缺陷和非常糟糕记录的API。 - Thracian
3个回答

2
尝试在片段的OnCreate中添加进入和退出过渡效果,这对我来说似乎很有效。请保留HTML标记。

0
我几年前就开始定义片段转换的方式,现在我也遇到了这个问题。我查看了我的旧代码,并在那里找到了答案。在我的情况下,布局中有几个ViewGroup,我希望子项有不同的进入转换效果。对我来说,通过在布局文件的根容器中添加android:transitionGroup="false"来解决了这个问题。

0

使用FragmentTransaction类中的setCustomAnimations方法。

getFragmentManager().beginTransaction() .setCustomAnimations(R.id.inAnim, R.id.outAnim,R.id.inAnim, R.id.outAnim) .replace(R.id.container, myFragment, MyFragment.TAG) .commit();

这样你就可以为每个转换定义一个动画。


2
因为这是旧的方法,所以被踩了。楼主正在使用更新的Transition API。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接