昨天给公司做的沉浸式状态栏,处处是大坑,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);*/
好嘞,这下应该都差不多能实现了,如果还不行,欢迎在下面留言。