Fragment进入转换的问题

lcw*_*_gg 7 android android-animation android-fragments android-transitions android-5.0-lollipop

我正在使用在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中定义片段输入转换: <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);
Run Code Online (Sandbox Code Playgroud)

它也有效!

最后我尝试添加一个空片段,然后将其替换为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();
Run Code Online (Sandbox Code Playgroud)

但仍然没有......

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

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

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

and*_*kie 2

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