KitKat中的半透明系统条和内容边距

时间:2013-12-26 07:35:45

标签: android android-layout user-interface android-4.4-kitkat

我正在尝试利用新的KitKat半透明系统条,在我的应用程序的背景中获得全屏图像。

我在找出正确的设置以获得我想要的行为时遇到了问题。现在我有ViewPagerFragment个,每个RelativeLayout由一个ImageView组成,其中包含TextView(用于背景图片)和android:Theme.Holo.Light.NoActionBar.TranslucentDecor内容。

我所追求的是让内容完全适合可用于交互的屏幕部分,并使图像占据屏幕的整个可见部分。

如果我只使用android:fitsSystemWindows = true作为我的主题,它在纵向上看起来很好,但导航栏与横向内容重叠(请参阅下面的屏幕截图)。

First attempt - portrait. Looks good. First attempt - landscape. nav bar overlaps the content

关注the recommendation in the docs后,我在主题中添加了{{1}},但这会产生一些奇怪的文物(见下文) Second attempt - portrait. Artifacts!! Second attempt - landscape. Artifacts!!

如何让它在第二个示例中表现得更好,但看起来不错,没有视觉瑕疵?

5 个答案:

答案 0 :(得分:39)

我的解决方案是在横向模式下禁用半透明导航。您仍然可以获得半透明的状态栏,但它解决了导航栏不透明并且在横向上重叠的问题。

res / values-v19 / styles.xml (这些值在我的主题中)

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">@bool/translucentNavBar</item>

res / values-v19 / bools.xml (启用半透明导航)

<bool name="translucentNavBar">true</bool>

res / values-land-v19 / bools.xml (在横向上禁用半透明导航)

<bool name="translucentNavBar">false</bool>

res / values-sw600dp-land-v19 / bools.xml (为横向平板电脑启用半透明导航)

<bool name="translucentNavBar">true</bool>

答案 1 :(得分:7)

我知道这已经过时了,但是我遇到了同样的问题并找到了一个简单的解决方案,所以我想分享一下,以防万一谷歌遇到这种情况。

当ViewPager(尤其是ImageSwitcher)放置在具有属性android:fitsSystemWindows="true"的布局中时,似乎存在Android错误。由于某种原因,系统窗口似乎正在获取遍布它们的工件。 :/

无论如何,我找到了解决办法。对于我的活动,我有一个XML布局如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    <!-- NOT HERE! android:fitsSystemWindows="true" -->
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageSwitcher
        android:id="@+id/background_image_switcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="0dp"
        android:layout_margin="0dp"
        android:background="@color/background_dark_navy"
        android:inAnimation="@android:anim/fade_in"
        android:outAnimation="@android:anim/fade_out"
        >

        <ImageView
            style="@style/BlurredBackgroundImage"
            />
        <ImageView
            style="@style/BlurredBackgroundImage"
            />

    </ImageSwitcher>

    <FrameLayout
        android:fitsSystemWindows="true" <!-- Here!!! -->
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Fitted content here -->

    </FrameLayout>

诀窍是不在包含android:fitsSystemWindows="true"属性的布局中包含ImageSwitcher,而是将android:fitsSystemWindows="true"属性移动到包含实际内容的内部 FrameLayout需要适合(你的案例中的标题文本)。不幸的是,这允许ImageSwitcher / ViewPager的视图被系统窗口略微切断,但如果图像像背景图像一样使用它无关紧要,并且比工件或维护所有更好可能有也可能没有禁用导航的不同尺寸/样式(例如当前选择的答案)。

我希望这有助于某人!

答案 2 :(得分:3)

我遇到了类似的问题,但我没有使用ViewPager,所以这可能无效。我通过Gabe描述的嵌套来解决:只有内部ViewGroup是fitSystemWindows =“true”,因此允许显示背景的外部ViewGroup在半透明条下延伸。然后我也打电话给requestFitSystemWindows()进行方向更改。同样,您的ViewPager可能会使事情变得复杂,我的解决方案将无法正常工作,但我希望这会有所帮助。

答案 3 :(得分:2)

将另一个ViewGroup放在带有图像的那个ViewGroup中,并将fitsSystemWindows设置为true

答案 4 :(得分:-3)

您应该将其包含在线性布局中,并将fitsSystemWindows设置为true。