安卓一个Activity中包含多个fragment实现沉浸式状态栏(最后是实现沉浸式的强制方法)

昨天给公司做的沉浸式状态栏,处处是大坑,fragment和activity设置沉浸式方法并不一样。

一个一个来吧。首先说设置普通activity的。注意,一定要先判断,如果手机的SDK版本在19以下,就别弄了,没用

安卓7.0之后,沉浸式状态栏变灰问题,解决办法,再setContentView之前添加以下代码。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            try {
                @SuppressLint("PrivateApi") Class decorViewClazz = Class.forName("com.android.internal.policy.DecorView");
                Field field = decorViewClazz.getDeclaredField("mSemiTransparentStatusBarColor");
                field.setAccessible(true);
                field.setInt(getWindow().getDecorView(), Color.TRANSPARENT);  //改为透明
            } catch (Exception ignored) {}
        }

1、在style中自定义主题。

  <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorPrimaryDark</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorPrimary</item>
    </style>

2、在AndroidManifest中想设置的actitvity下的theme中设置主题。

 <activity
            android:name=".activity.AddItemActivity"
            android:label="添加项目"
            android:launchMode="singleTask"
            android:parentActivityName=".activity.MainActivity"
            android:theme="@style/AppTheme.NoActionBar">

3、在你的活动的布局的跟布局下加一行代码,至于为什么要加,你可以自己不加试试效果。

android:fitsSystemWindows="true"

到此为止,你应该已经实现了沉浸式。但是这并不是重点,这都是小菜。大坑来了。。

4、如果你在活动中使用了toolbar,恭喜你,需要注意了。你会发现按照上面的设置还是会出现不同的问题,你并不能在布局文件的根布局下加第三点中所说的代码。你应该在toolbar中添加。

5、真正的大坑来了,活动中嵌套fragment,而且活动中还使用了toolbar。注意。这样做需要注意以下几点:toolbar中还需要添加第三条中的代码;你的fragment中的第二个布局中添加那行代码,没错,并不是根布局,一定要注意。这样基本上差不多了。

但是,如果这些还是满足不了你的需求,看下面。

6、在se't'Content'View前添加两行代码,当然最好还是进行一下SDK的判断。必须大于19以上才可以

 /*//透明状态栏
        getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //透明导航栏
        getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

7、第六点只是把状态栏给隐藏了。并没有实现沉浸式,因为这里说的是强制。所以下面这段代码是强制给状态栏添加一个颜色

View views = new View(getActivity());
        ViewGroup.LayoutParams params = new ViewGroup
                .LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 60);
        views.setLayoutParams(params);
        views.setBackgroundColor(Color.rgb(18,150,219));

        ViewGroup decorView = (ViewGroup) getActivity().getWindow().getDecorView();
        decorView.addView(views);*/

好嘞,这下应该都差不多能实现了,如果还不行,欢迎在下面留言。

猜你喜欢

转载自blog.csdn.net/haojiagou/article/details/81083772