android 导航栏位置,android手机导航栏

这篇博客详细介绍了如何在Android应用中实现状态栏和导航栏的透明及沉浸式效果,包括API 21及以上和低于21版本的处理方式。通过设置Window属性和使用SYSTEM_UI_FLAG相关标志,可以实现全透明、半透明状态,并处理内容与状态栏重叠的问题。同时提供了获取状态栏高度的方法,以避免内容与状态栏冲突。
摘要由CSDN通过智能技术生成

/**

* 设置透明状态栏与导航栏

* @param navi true不设置导航栏|false设置导航栏

*/

public void setStatusBar(boolean navi) {

//api>21,全透明状态栏和导航栏;api>19,半透明状态栏和导航栏

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

Window window = getWindow();

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.setStatusBarColor(Color.TRANSPARENT);

if (navi) {

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN//状态栏不会被隐藏但activity布局会扩展到状态栏所在位置

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION//导航栏不会被隐藏但activity布局会扩展到导航栏所在位置

| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

window.setNavigationBarColor(Color.TRANSPARENT);

} else {

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

}

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

if (navi) {

//半透明导航栏

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

}

//半透明状态栏

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

}

}/**

* 进入沉浸模式

* @param view view

*/

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)

public static void hideSystemUI(View view) {

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_FULLSCREEN

| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY//会自动隐藏

);

}

/**

* 退出沉浸模式

* @param view view

*/

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)

public static void showSystemUI(View view) {

view.setSystemUiVisibility(

View.SYSTEM_UI_FLAG_LAYOUT_STABLE

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

}注意:状态栏或导航栏进行透明处理之后,咱们的布局内容是会扩展到原来状态栏与导航栏的位置,但是这样就会造成状态栏显示的内容与我们的布局内容重叠,所以接下来还需要进行一步处理,本人偷懒所以只是在代码中获取页面最上面的控件进行paddingTop出状态栏的高度(国内大多数品牌的手机都是没有底部导航栏的,所以不做处理)获取状态栏高度的代码:/**

* 获取状态栏高度

*

* @param context 上下文

* @return 状态栏高度

*/

public int getStatusBarHeight(Context context) {

int statusBarHeight = 0;

try {

Class> clazz = Class.forName("com.android.internal.R$dimen");

Object obj = clazz.newInstance();

Field field = clazz.getField("status_bar_height");

int temp = Integer.parseInt(field.get(obj).toString());

statusBarHeight = context.getResources().getDimensionPixelSize(temp);

} catch (Exception e) {

e.printStackTrace();

}

return statusBarHeight;

}主要的几个flag:public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 0x00000002;  隐藏导航栏public static final int SYSTEM_UI_FLAG_FULLSCREEN = 0x00000004;  字面意思是全屏显示,实际是状态栏会被隐藏而导航栏未作处理public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 0x00000200;  导航栏不会被隐藏但布局会扩展到导航栏所在位置public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 0x00000400;  状态栏不会被隐藏但布局会扩展到状态栏所在位置public static final int SYSTEM_UI_FLAG_IMMERSIVE = 0x00000800;  配合SYSTEM_UI_FLAG_HIDE_NAVIGATION使用,如果只有SYSTEM_UI_FLAG_HIDE_NAVIGATION而不设置SYSTEM_UI_FLAG_IMMERSIVE,那么用户交互后会自动清除SYSTEM_UI_FLAG_HIDE_NAVIGATION这个flag;public static final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 0x00001000;  配合SYSTEM_UI_FLAG_HIDE_NAVIGATION和(或)SYSTEM_UI_FLAG_FULLSCREEN使用,设置这个flag之后,用户在屏幕顶部下滑或者在底部上滑调出状态栏、导航栏之后它们仍会自动隐藏;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值