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 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()忽略.<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的设备并且过渡工作(不改变代码中的任何内容)!仍然不知道发生了什么......
所以我的最后一个问题是:对这种行为有什么解释,有没有办法让它在不使用技巧的情况下工作?
| 归档时间: |
|
| 查看次数: |
1749 次 |
| 最近记录: |