android-fragments 如何更改片段的状态栏颜色?

bkhjykvo  于 2022-11-14  发布在  Android
关注(0)|答案(4)|浏览(352)

我有一个活动,我在用户触摸事件上使用了五个片段。我想为三个片段设置状态栏颜色,而为另外两个片段设置状态栏。
如果我在一个片段的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">

提前感谢你的帮助。

1szpjjfi

1szpjjfi1#

如果你想以编程方式改变状态栏的颜色(假设设备安装了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:-
在活动中创建方法

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")
kmynzznz

kmynzznz2#

这是你能做的最简单的事情:
getActivity().getWindow().setStatusBarColor(getActivity().getColor(R.color.white));

o7jaxewo

o7jaxewo3#

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
         
            }

现在,如果你想对底部导航做同样的事情,那么模式是相同的,依此类推。

2ekbmq32

2ekbmq324#

只需在您的java类片段中写入这一行

((AppCompatActivity)requiereActivity()).getWindow().setStatusBarColor(R.color.white);

相关问题