当前位置: 首页 > 知识库问答 >
问题:

Android 4.4-半透明状态/导航栏-FitsSystemWindows/clipToPadd不通过片段事务工作

龙永逸
2023-03-14

使用新的Android 4.4 KitKat API中的半透明状态和导航栏时,将fitsSystemWindows="true"clipToPadd="false"设置为ListView最初工作。fitsSystemWindows="true"将列表保存在操作栏下方和导航栏上方,clipToPadd="false"允许列表在透明导航栏下滚动,并使列表中的最后一项向上滚动到足以通过导航栏的位置。

但是,当您通过碎片事务将内容替换为另一个碎片时,fitsSystemWindows的效果将消失,碎片将位于操作栏和导航栏下。

我这里有一个演示源代码的代码库,还有一个可下载的APK作为示例:https://github.com/afollestad/kitkat-transparency-demo.要了解我在说什么,请从运行KitKat的设备打开演示应用程序,点击列表中的一个项目(这将打开另一个活动),然后点击打开的新活动中的一个项目。替换内容的片段位于操作栏下方,并且clipToPadd无法正常工作(当您向下滚动时,导航栏覆盖了列表中的最后一项)。

有什么想法吗?需要澄清吗?我发布了我为雇主开发的个人应用程序的前后截图。

共有3个答案

孙凌
2023-03-14

好吧,这太奇怪了。我最近遇到了同样的问题,只是我的问题涉及软键盘。它最初可以工作,但如果我添加片段事务,android:fitsSystemWindows=“true”将不再工作。我在这里尝试了所有的解决方案,没有一个对我有效。

它没有调整我的视图大小,而是提升了我的视图,这就是问题所在。

然而,我很幸运,意外地找到了一个对我有用的答案!

这就是:

首先,我的应用主题是:主题。AppCompat。Light。NoActionBar(如果这是相关的,也许是,android很奇怪)。

莫里西在这里指出了一些非常有趣的事情,所以我想测试一下他说的是真是假。他说的对我来说也是真的。。。除非将此属性添加到应用程序android清单中的活动中:

一旦您添加:

android:windowSoftInputMode="adjustResize" 

对于您的活动,片段事务后不再忽略android:fitsSystemWindows=“true”!

但是,我希望你不要在片段的根布局上调用android:fitsystemwindows=“true”。如果您有EditText或ListView,则会出现此问题的最大地方之一是。如果您像我一样陷入这种困境,请在根布局的子级中设置如下:

是的,此解决方案适用于所有Lollipop和Lollipop前设备。

它会重新调整大小,而不是将布局向上推。所以,希望我已经帮助了一些和我处境相同的人。

非常感谢大家!

支铭晨
2023-03-14

我使用库解决了这个问题,我使用设置半透明状态栏的颜色。

SystemBarInt的SystemBarConfig类(如下所示https://github.com/jgilfelt/SystemBarTint#systembarconfig)让您获得我在每个片段中设置为列表填充的插入,以及列表上的使用。

我在这篇文章中详细介绍了我所做的工作:html" target="_blank">http://mindofaandroiddev.wordpress.com/2013/12/28/making-the-status-bar-and-navigation-bar-transparent-with-a-listview-on-android-4-4-kitkat/

晏卓君
2023-03-14

我昨天纠结于同样的问题,想了很多之后,我找到了一个优雅的解决这个问题的方法。

首先,我在ViewParent上看到了方法requestFitSystemWindows(),我试图在片段的activitycreated()上调用它(在片段附加到视图层次结构之后),但遗憾的是,它没有任何效果。我想看看如何使用这种方法的具体例子。

然后,我找到了一个巧妙的解决方法:我创建了一个自定义的FitsSystemWindowsFrameLayout,在布局中用作片段容器,作为经典的FrameLayout的替代品。它所做的是在系统调用fitSystemWindows()时记忆窗口插入,然后在添加/附加片段后,它会将调用再次传播到其子布局(片段布局)。

以下是完整代码:

public class FitsSystemWindowsFrameLayout extends FrameLayout {

    private Rect windowInsets = new Rect();
    private Rect tempInsets = new Rect();

    public FitsSystemWindowsFrameLayout(Context context) {
        super(context);
    }

    public FitsSystemWindowsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FitsSystemWindowsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected boolean fitSystemWindows(Rect insets) {
        windowInsets.set(insets);
        super.fitSystemWindows(insets);
        return false;
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        super.addView(child, index, params);
        tempInsets.set(windowInsets);
        super.fitSystemWindows(tempInsets);
    }
}

我认为这比尝试通过访问隐藏的系统属性来确定UI元素大小的黑客要简单和健壮得多,这些属性可能会随着时间的推移而变化,然后手动将填充应用于元素。

 类似资料:
  • 我正在尝试为一个学校项目制作我的第一个应用程序。我有时会通过跟随其他人的问题和答案来获得半透明的状态栏,但是导航只是变成灰色,但是没有活动的内容,但是抽屉菜单在状态栏和导航栏下面绘制,我如何使活动也在状态栏和导航栏下面绘制? 在此处输入图像描述 在此处输入图像描述 在onCreate下,图2的代码为: WindowManager。布局参数。旗帜(半透明导航); 我试过使用android:fitsy

  • 我想整合一些像这样的东西: 我已经这样做了,但是我似乎不能把图像视图放在工具栏下面。没有工具栏,我可以在状态栏下制作,但是把这两者结合起来是不可能的。 这是我的布局: 在我的活动中,我做了以下工作: 我还声明了一个 styles-v21.xml 文件: 并将其设置为Photo活动的默认样式。我已经尝试将工具栏放在FrameLayout中,但这样做我的工具栏只会隐藏,如下所示: 提前感谢。 已修复,

  • 只有在第一次打开应用程序时,半透明的状态栏才会出现问题。请看屏幕截图: http://i1335.photobucket.com/albums/w673/ductruongcntt/Screenshot_2014-06-26-14-17-26_zps1e9a56f4.png 以下是我使用的样式的XML,其中包括半透明状态栏: 我的主题是:

  • 我不确定这是否可行,但我正在尝试在不使状态栏透明的情况下使导航栏透明。之所以选择后者,是因为我有一个工具栏,如果不是这样的话,它会在状态栏后面绘制。 现在,我正在使用一个fakeStatusBar布局,它显示在状态栏之前,这样用户就可以看到所有的东西: 唯一的问题是,在进行多任务处理时,缩略图看起来不太好,因为工具栏不在它应该位于的位置。

  • 我想在我的应用程序上有一个透明的状态栏(所以背景在后面),但我希望底部的导航栏保持黑色。 我可以通过设置

  • 我想制作一个完全透明的状态栏和导航栏,就像Google Play那样。当我使用窗口设置来实现它时,键盘会覆盖编辑文本。 当此代码使用键盘输入覆盖的编辑文本时: 此外,该代码并没有使其完全透明,它只是使其半透明 还是这个