在 Android 中为不同设备管理软底栏时遇到问题

Posted

技术标签:

【中文标题】在 Android 中为不同设备管理软底栏时遇到问题【英文标题】:Trouble managing Soft bottom bars in Android for different devices 【发布时间】:2020-01-07 23:42:02 【问题描述】:

我创建了一个如下设置 fitSystemWindow 属性的函数:

private void setFitSystemWindows() 
        try 
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP) 
                // Do something for lollipop and above versions
                View view = findViewById(R.id.relRoot);
                view.setFitsSystemWindows(true);
                view.setPadding(0, 0, 0, 0);

                Window window = getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.setStatusBarColor(ContextCompat.getColor(CameraActivity.this, R.color.colorBlackTransperent));
             else 
                // do something for phones running an SDK before lollipop
                View view = findViewById(R.id.relRoot);
                view.setFitsSystemWindows(false);
                view.setPadding(0, 0, 0, 0);
            
         catch (Exception e) 
            e.printStackTrace();
        
    

让我解释一下:

这里,R.id.relRoot 是布局 xml 文件中的父根 RelativeLayout

我首先检查构建版本,如果构建版本大于 Lollipop,我将 fitsSystemWindows 设置为 true,如果不是,则将其设置为 false

但是,当我在设备 > Lollipop 中运行应用程序时,我的状态栏颜色为白色底部软视图(包含返回、主页和最近) 还有白色

您可以看到我也在使用方法setStatusBarColor,但它不起作用。

可能是什么问题?

注意:正在检查模拟器设备:NEXUS 5X API 27(Android 8.1.0,API 27)

【问题讨论】:

如果您想删除状态栏,请将您的活动设为全屏活动。 【参考方案1】:

在这里,我使用已实现的此功能设置状态栏颜色。 在 Lollipop 中,我将状态栏颜色设置为黑色。在上面的版本中,我设置了我的应用主题颜色。

功能:-

fun setStatusBarColor(activity: Activity, color: Int) 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            activity.window.statusBarColor = ContextCompat.getColor(activity, color)
            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP || Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1) 
                activity.window.statusBarColor = ContextCompat.getColor(activity, android.R.color.black)
            
        
    

注意:-上面这个函数我已经在kotlin中实现了。

Java 函数:-

public void setStatus(Activity activity, int color)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity, color));
            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP || Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1)
                activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity, android.R.color.black));
        
    

【讨论】:

【参考方案2】:

嗯,我试过你的代码,它对我有用。 所以我只能尝试分析你的代码sn-p。

    调试器说什么? 您是否尝试在方法旁边设置标记?调试器去哪儿了?也许调试器出于某种原因跳入了异常。

    在以下情况下更正:

if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP) 
    // Do something for lollipop and above versions

您不是在寻找棒棒糖及以上版本,而是在寻找以上版本,除了棒棒糖。如果您也想查找棒棒糖,请使用>=

    检查颜色。 您是否尝试设置另一种颜色(不透明)?

    上下文。你试过getApplicationContext()或类似的吗?

我建议您使用调试器来查找问题。也许它与代码有关,也许与颜色有关。 正如我所说,我尝试了你的代码,它对我有用。

【讨论】:

以上是关于在 Android 中为不同设备管理软底栏时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 制作具有绝对位置的底栏

Android 中的折叠底栏(如 Google 音乐)

基于导航控制器的视图的底栏是啥?

使用循环片段依赖关系模块化单活动Android应用程序

如何在 Cordova 中为不同平台定义不同的文件链接

如何在android中为不同颜色的按钮重用选择器?