【问题标题】:How can i exclude ActionBar when transitions between Activities on Android 5.0在 Android 5.0 上的活动之间转换时如何排除 ActionBar
【发布时间】:2017-10-19 03:11:27
【问题描述】:

在 Android 5.0 Lollipop 上,

我有两个活动 A 和 B。活动 B 有一个从底部的 slie enter 过渡,带有一个 Overlay ActionBar,但是当 B 显示时,ActionBar 也从底部滑动到顶部。

如何防止操作栏滑动过渡。系统操作栏有我可以添加到排除目标的 id 吗?

谢谢!

【问题讨论】:

  • 考虑使用 Lollipop 中引入的工具栏,以获得更多的标题灵活性。
  • 由于您使用的是窗口动画,因此它也适用于操作栏。我建议使用片段并自下而上对其进行动画处理。

标签: android android-actionbar android-5.0-lollipop activity-transition shared-element-transition


【解决方案1】:

如果您使用的是 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 版本中发生更改,此代码将中断。我怀疑它会不会改变...

有关其他一些相关信息,请参阅this post

【讨论】:

  • 什么是slideTransition?
  • 我在回答中将slideTransition 重命名为enterTransition。我之所以称它为slideTransition,是因为OP询问了如何实现上滑进入过渡。
  • 有没有办法以xml的方式指定这种类型的约束?
  • @avalactus 如果您使用的是 AppCompat v7 库,我相信您可以通过将 <targets><target android:excludeId="@id/action_bar_container"/></targets> 添加到转换的 XML 中来排除操作栏。
  • 这对我不起作用!我启用了 AppCompat v7,并逐字按照说明进行操作,但工具栏仍在动画中。
【解决方案2】:

我的解决方案是用这个 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>

您可以随意使用这些转换,重要的是那些被排除的目标。

【讨论】:

  • 如果有 2 个滑动过渡,一个用于进入,一个用于退出 - 向相反方向滑动,也许这会更好。这对我有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多