片段问题进入过渡

时间:2015-08-21 03:02:58

标签: android android-fragments android-animation android-5.0-lollipop android-transitions

我使用在Android 5.0上运行的设备,minSdk为21,targetSdk为22。

应用说明

我在一个包含2项活动的应用中,活动A包含带有图片和文字的GridView,活动B包含一个ImageView,一个TextView和一个片段。该片段包含与文本关联的图像列表。 单击活动A的图像时,会有一个共享元素转换,将图像和文本移动到活动B的ImageViewTextView。我还在活动A和活动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);

也不是

<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版本。

奖金错误:仍然是片段进入转换。在拥有我之前描述的应用之前,我尝试了一个没有共享元素转换的版本。如果我没有为活动B的TextView设置转换名称,则该片段将永远不会有输入转换。但与之前相同,如果在onclicklistener方法中设置,它将起作用。我在Android 5.0.x上运行的2台设备上尝试过此操作,转换无效。我尝试使用Android 5.1.1的设备并且过渡工作(不改变代码中的任何内容)!仍然不知道发生了什么......

所以我的最后一个问题是:对这种行为有什么解释,有没有办法让它在不使用技巧的情况下工作?

2 个答案:

答案 0 :(得分:3)

尝试在其OnCreate中添加片段的进入和退出转换。这似乎对我有用

答案 1 :(得分:-1)

使用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();

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