如何更改片段的状态栏颜色?
How to change fragment's status bar color?
我 activity 在用户触摸事件中使用了五个片段。我想为 3 个片段设置状态栏颜色,而其他两个片段没有状态栏。
如果我在一个片段的 onCreateView 方法中使用下面的代码,它会更改 activity 的状态栏,并且所有片段都变成白色,因为我使用了 getActivity() 方法。所以我正在寻找碎片的解决方案。
getActivity().getWindow.setStatusBatColor(Color.White);
我也尝试在 style.xml 中设置我的主题并在 xml 中应用 fragemnts 根布局,但它也不起作用。
styles.xml
<style name="StatusBarColor" parent="AppBaseTheme">
<item name="android:statusBarColor">#F5F5F5
</item>
</style>
fragment1.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:theme="@style/StatusBarColor"
android:background="@color/home_bg_white"
tools:context="mycontext">
提前感谢您的帮助。
如果您想以编程方式更改状态栏颜色(前提是设备有 Android 5.0),那么您可以使用 Window.setStatusBarColor()
。 activity 是从 Activity
还是 ActionBarActivity
.
派生的应该没有区别
试试看:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.BLUE);
}
刚刚使用 ActionBarActivity 对此进行了测试,它工作正常。
注意:如果您的 values-v21 样式文件已经设置了 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
标志,则无需通过编程方式设置它,通过:
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
编辑 2:-
在您的 activity
中创建一个方法
public void updateStatusBarColor(String color){// Color must be in hexadecimal fromat
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor(color));
}
}
从您的片段中调用此方法
((ActivityName)getActivity()).updateStatusBarColor("#000000")
这是您可以做的最简单的事情:
getActivity().getWindow().setStatusBarColor(getActivity().getColor(R.color.white));
KOTLIN 解决方案:
当您创建一个 activity 和相应的片段(1 activity 到多片段方案)时,您首先在清单中设置一个主题(可以自动设置)以及该主题及其所有属性应用于所有 activity 的片段,除非您覆盖所需片段中的特定 属性。
在您的情况下,属性 是状态栏颜色。
要更改状态栏颜色,您需要在片段 onCreate 方法中输入下一个代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().window.statusBarColor = Color.GREEN
}
但是如果你在你的主题风格中举个例子
<item name="android:windowTranslucentStatus">true</item>
您的主题xml:
<style name="Theme.MyTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/red_2091765</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="android:statusBarColor"tools:targetApi="l">?attr/colorPrimaryVariant</item>
<item name="android:windowTranslucentStatus">true</item> //HERE
<item name="android:windowTranslucentNavigation">true</item>
</style>
那么你的状态栏颜色将不会改变,因为你首先需要清除标志,或者简而言之,你需要通过这样做来覆盖 windowTranslucentStatus:
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
因此,在您定义了 windowTranslucentStatus = true 的情况下,接下来是最终代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().window.clearFlags
(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
requireActivity().window.statusBarColor = Color.GREEN
}
现在,如果您想对底部导航执行相同的操作,则模式相同,依此类推。
我 activity 在用户触摸事件中使用了五个片段。我想为 3 个片段设置状态栏颜色,而其他两个片段没有状态栏。
如果我在一个片段的 onCreateView 方法中使用下面的代码,它会更改 activity 的状态栏,并且所有片段都变成白色,因为我使用了 getActivity() 方法。所以我正在寻找碎片的解决方案。
getActivity().getWindow.setStatusBatColor(Color.White);
我也尝试在 style.xml 中设置我的主题并在 xml 中应用 fragemnts 根布局,但它也不起作用。
styles.xml
<style name="StatusBarColor" parent="AppBaseTheme">
<item name="android:statusBarColor">#F5F5F5
</item>
</style>
fragment1.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:theme="@style/StatusBarColor"
android:background="@color/home_bg_white"
tools:context="mycontext">
提前感谢您的帮助。
如果您想以编程方式更改状态栏颜色(前提是设备有 Android 5.0),那么您可以使用 Window.setStatusBarColor()
。 activity 是从 Activity
还是 ActionBarActivity
.
试试看:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.BLUE);
}
刚刚使用 ActionBarActivity 对此进行了测试,它工作正常。
注意:如果您的 values-v21 样式文件已经设置了 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
标志,则无需通过编程方式设置它,通过:
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
编辑 2:-
在您的 activity
中创建一个方法public void updateStatusBarColor(String color){// Color must be in hexadecimal fromat
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor(color));
}
}
从您的片段中调用此方法
((ActivityName)getActivity()).updateStatusBarColor("#000000")
这是您可以做的最简单的事情:
getActivity().getWindow().setStatusBarColor(getActivity().getColor(R.color.white));
KOTLIN 解决方案:
当您创建一个 activity 和相应的片段(1 activity 到多片段方案)时,您首先在清单中设置一个主题(可以自动设置)以及该主题及其所有属性应用于所有 activity 的片段,除非您覆盖所需片段中的特定 属性。 在您的情况下,属性 是状态栏颜色。
要更改状态栏颜色,您需要在片段 onCreate 方法中输入下一个代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().window.statusBarColor = Color.GREEN
}
但是如果你在你的主题风格中举个例子
<item name="android:windowTranslucentStatus">true</item>
您的主题xml:
<style name="Theme.MyTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/red_2091765</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="android:statusBarColor"tools:targetApi="l">?attr/colorPrimaryVariant</item>
<item name="android:windowTranslucentStatus">true</item> //HERE
<item name="android:windowTranslucentNavigation">true</item>
</style>
那么你的状态栏颜色将不会改变,因为你首先需要清除标志,或者简而言之,你需要通过这样做来覆盖 windowTranslucentStatus:
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
因此,在您定义了 windowTranslucentStatus = true 的情况下,接下来是最终代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().window.clearFlags
(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
requireActivity().window.statusBarColor = Color.GREEN
}
现在,如果您想对底部导航执行相同的操作,则模式相同,依此类推。