使用LAYOUT_FULLSCREEN或LAYOUT_STABLE UI标志时,浅状态栏图标不会变暗吗?

时间:2019-04-05 19:05:28

标签: java android android-xml android-statusbar

因此,当我将应用强制设为“浅色主题”时,我的应用status bar不能将其图标更改为深色,这是一个问题。

我发现了问题的根源,那就是当我拥有status bar标志SYSTEM_UI和{{时,LAYOUT_STABLE中的图标不想变暗1}}应用于LAYOUT_FULLSCREEN。当我删除这两个标志时,Activity中的图标已正确变暗。

但是,上述“解决方案”的问题在于,我正在使用2个status bar标志,以使我的“活动”内容滚动到SYSTEM_UI以下,我已将其设置为半透明。除了使用status bar我目前拥有的两个status bar标志之外,我还没有想出让我的SYSTEM_UI接受透明度并在其下方滚动内容的另一种方法,它们再次是{ {1}}和Activity

有人对我如何解决这个问题有想法吗?

也许有人可以向我展示一种可靠的方式来让我的SYSTEM_UI_FLAG_LAYOUT_STABLE接受透明度,并且可以看到内容在其下方滚动而不必使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN标志?我想这可能会解决我的问题...

我认为与共享相关的唯一代码是:

在我的 MainActivity.java 中,我进行了以下设置:

status bar

在我的 styles.xml 中,我为此SYSTEM_UI设置了这个主题:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);`

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,所以我自己弄清楚了。看来我可能需要在调用SYSTEM_UI之前设置setContentView标志。不过,可能是这些更改组合起来使它对我有用-我不确定。

我所做的更改是在调用setContentView之前使用了这些标志:

if (lightMode) {
        setTheme(R.style.AppTheme_Light_NoActionBar);
        getWindow().getDecorView().setSystemUiVisibility
               (View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR |
                View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | 
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    }
上面的

lightMode是我设置的SharedPreference布尔值,如果用户在我的应用程序的Change theme中选择了toolbar按钮(对于暗模式/主题)。

最后,对于我的MainActivity的主题,我在styles.xml中设置了此样式(对于API 27及更高版本-对于较低的Android API的styles.xml看起来有些不同):

<!-- Toolbar/NoActionBar variant of default Light Theme -->
<style name="AppTheme_Light_NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/pure_white_transparent</item>
    <item name="colorPrimaryDark">@color/pure_white_transparent</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@color/pure_white_transparent</item>
    <item name="android:navigationBarColor">@color/pure_white_transparent</item>
</style>

因为在我看来,将SYSTEM_UI标志设置为LAYOUT_FULLSCREENLAYOUT_STABLE会使toolbar坐在statusbar下方,所以我已经设置了通过以下方式进行一些适当的填充:

int statusBarHeight = getStatusBarHeight(this); 其中getStatusBarHeight是一种用于说明不同Android设备(例如Pixel 3XL较大的statusbars)上statusbar大小可能不同的方法。

我从StackOverflow上的其他地方获得了这种工作方法,但忘记了哪里,所以如果有人知道,可以随时链接它-以下方法:

    // Gets the StatusBar's height of the particular display.
    public static int getStatusBarHeight(final Context context) {
        final Resources resources = context.getResources();
        final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            return resources.getDimensionPixelSize(resourceId);
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                return (int) Math.ceil(24 * resources.getDisplayMetrics().density);
            } else {
                return (int) Math.ceil(25 * resources.getDisplayMetrics().density);
            }
        }
}

然后,我以编程方式获取int statusBarHeight的值并将其用作我的toolbar的最高利润:

// Setup the values for the toolbar's layout parameters.
    CoordinatorLayout.LayoutParams toolbarParams = new CoordinatorLayout.LayoutParams(
            CoordinatorLayout.LayoutParams.MATCH_PARENT,
            CoordinatorLayout.LayoutParams.WRAP_CONTENT
    );
    toolbarParams.setMargins(0, statusBarHeight, 0, 0);

    // Find, Assign, and Setup the Toolbar to take place of the Actionbar.
    // Then inflate the proper menu to be used on-top of it, and set its layout parameters
    // which have been set in the code above.
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.inflateMenu(R.menu.menu_main);
    getSupportActionBar().setDisplayShowTitleEnabled(true);
    toolbar.setLayoutParams(toolbarParams);

最后,我已确保我的应用RecyclerView正确地位于statusbartoolbar下方,这是通过编程设置适当的填充来完成的:

// Get and set the values for the OffsetPadding for the RecyclerView to int.
    int itemOffsetPaddingSide = (int) getResources().getDimension(R.dimen.item_offset);
    int actionBarSize = (int) getResources().getDimension(R.dimen.actionbarSizeWithExtraPadding);
    int itemOffsetPaddingTop = actionBarSize + statusBarHeight;
    // Set all the OffsetPadding values to the RecyclerView programmatically, so that
    // all the UI elements are padding properly, taking into account the devices screen
    // density/size/resolution!
    mRecyclerView.setPadding(itemOffsetPaddingSide, itemOffsetPaddingTop, itemOffsetPaddingSide, itemOffsetPaddingSide);

int itemOffsetPaddingSide的值为4dp,对于int actionBarSize的值为60dp,对于int itemOffsetPaddingTop的值,通过组合actionBarSize和{{1 }},我们得到statusBarHeight加上特定设备的56dp的高度(因为在后面的代码中检索并分配给statusBar的值)。

这一切都使我的statusBarHeight的内容舒适地位于RecyclerViewstatusbar的下方,并且由于{{1 }}具有toolbar

我已经独立研究Java编程和Android应用程序开发近两年了,尽管我为自己这次的成就感到自豪,但我不确定这是否是最优雅的方法在我的应用程序中实现此效果。但是无论哪种方式,它都有效,如果您发现它也对您的应用有用,请告诉我!