因此,当我将应用强制设为“浅色主题”时,我的应用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);`
有什么想法吗?
答案 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_FULLSCREEN
和LAYOUT_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
正确地位于statusbar
和toolbar
下方,这是通过编程设置适当的填充来完成的:
// 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
的内容舒适地位于RecyclerView
和statusbar
的下方,并且由于{{1 }}具有toolbar
。
我已经独立研究Java编程和Android应用程序开发近两年了,尽管我为自己这次的成就感到自豪,但我不确定这是否是最优雅的方法在我的应用程序中实现此效果。但是无论哪种方式,它都有效,如果您发现它也对您的应用有用,请告诉我!