在 Android 5.0 Lollipop 上,
我有两个活动 A 和 B。活动 B 有一个从底部使用 Overlay ActionBar 的 slie enter 过渡,但是当 B 显示时,ActionBar 也从底部滑动到顶部。
如何防止操作栏滑动过渡。系统操作栏有我可以添加到排除目标的 id 吗?
谢谢!
在 Android 5.0 Lollipop 上,
我有两个活动 A 和 B。活动 B 有一个从底部使用 Overlay ActionBar 的 slie enter 过渡,但是当 B 显示时,ActionBar 也从底部滑动到顶部。
如何防止操作栏滑动过渡。系统操作栏有我可以添加到排除目标的 id 吗?
谢谢!
如果您使用的是 AppCompat v7 库,则很容易:
View decor = getWindow().getDecorView();
int actionBarId = R.id.action_bar_container;
enterTransition.excludeTarget(decor.findViewById(actionBarId), true);
不幸的是,操作栏容器视图 ID 不是公共 API 的一部分,因此如果您没有使用 AppCompat v7 库(即您使用的是官方框架库),您将需要使用以下代码来解决这个问题来检索ID 改为:
int actionBarId = getResources().getIdentifier("action_bar_container", "id", "android");
请注意,如果操作栏容器的 ID 名称在未来的 Android 版本中发生更改,此代码将中断。我怀疑它永远不会改变......
有关其他一些相关信息,请参阅此帖子。
我的解决方案是用这个 args 扩展样式:
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowEnterTransition">@transition/slide</item>
<item name="android:windowExitTransition">@transition/slide</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@transition/enter</item>
<item name="android:windowSharedElementExitTransition">@transition/enter</item>
这是我的res/transition/slide.xml
:
<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/android" android:slideEdge="bottom">
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
</targets>
</slide>
这是我的res/transition/enter.xml
:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:targetSdkVersion="19"
android:transitionOrdering="sequential">
<targets>
<target android:excludeId="@id/action_bar_container"/>
<target android:excludeId="@android:id/statusBarBackground"/>
</targets>
<changeBounds/>
<changeTransform/>
<changeClipBounds/>
<changeImageTransform/>
</transitionSet>
您可以随意使用这些转换,重要的是那些被排除的目标。