沉浸式解决 任意修改状态栏 虚拟按键 背景和高度 测量虚拟按键高度 状态栏高度
来源:互联网 发布:淘宝客返利软件 编辑:程序博客网 时间:2024/06/05 18:23
本文主要介绍沉浸式的一种解决方案。
## 使用方法 ##
实现onCreate() 返回你的主视图即可
public class MainActivity extends BaseActivityRex { @Override protected int onCreate() { return R.layout.activity_main; } @Override protected void initView() { }}
核心原理
1.根据资源ID获取状态栏高度 和手机带虚拟键盘高度 响应的尺寸值
根据版本打开沉浸式后,得到其占位可自定义其显示
或者设为0让它全屏,一般下方会有一些按钮 全屏按钮和 虚拟键盘重叠十分不好看。
2.动态布局添加 让主视图成为 一部分view。方便自定义一些共用布局,和视图操作。如过度画面啊 加载界面
或者 全局性的title bar都可以在添加statusView后 自行添加。
3.简化了下find id
都是些小东西 自己用起来觉得方便。分享给大家。由于经常要交接代码给别人,所以习惯用原生可见易理解的东西封装。
源码
package your packageimport android.app.Activity;import android.content.Intent;import android.content.pm.ActivityInfo;import android.content.res.Resources;import android.graphics.Color;import android.os.Build;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.FragmentActivity;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.LinearLayout;import java.lang.reflect.Method;/** * 简化activity流程 * 完美适配所有的可用沉浸式 * 如果该版本存在,直接操作statusView navigationView 可自定义沉浸式 具体显示的内容 颜色 并非要和 相连颜色一致 * 如果不想要占位,设为高度0即可 那么你的主视图内容就会延伸占到statusView navigationView位置 */public abstract class BaseActivityRex extends FragmentActivity { private boolean is_new_version = false; public Bundle savedInstanceState = null; private Activity activity; private View statusView; private View navigationView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); activity = BaseActivityRex.this; setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //竖屏 this.savedInstanceState = savedInstanceState; if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & getIntent().getFlags()) != 0) { finish(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); is_new_version = true; } else { is_new_version = false; } int mainUi = onCreate(); intSetContentView(mainUi); onCreateWithBundle(savedInstanceState); initView(); initData(); } private void intSetContentView(int mainUiId) { LinearLayout.LayoutParams lp_root = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0); LinearLayout linearRoot = new LinearLayout(activity); linearRoot.setOrientation(LinearLayout.VERTICAL); setContentView(linearRoot); //添加状态栏占位 LinearLayout.LayoutParams lp_status = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0); statusView = new View(linearRoot.getContext()); linearRoot.addView(statusView, lp_status); //添加主视图父容器 LinearLayout.LayoutParams lp_main_ui_parent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1); LinearLayout main_ui_parent = new LinearLayout(linearRoot.getContext()); linearRoot.addView(main_ui_parent, lp_main_ui_parent); //虚拟按键占位 navigationView = new View(linearRoot.getContext()); linearRoot.addView(navigationView, lp_status); //添加主视图 if (mainUiId > 0) { View view = View.inflate(activity, mainUiId, null); main_ui_parent.addView(view); } } protected void onCreateWithBundle(Bundle savedInstanceState) { } @Override protected void onStart() { super.onStart(); Resources resources = getResources(); if (!is_new_version) { if (statusView != null) { statusView.setVisibility(View.GONE); } } else { /** * 获取状态栏高度——方法1 * */ int statusBarHeight = -1; //获取status_bar_height资源的ID int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusView.setVisibility(View.VISIBLE); //根据资源ID获取响应的尺寸值 statusBarHeight = getResources().getDimensionPixelSize(resourceId); ViewGroup.LayoutParams lp = statusView.getLayoutParams(); lp.width = ViewGroup.LayoutParams.MATCH_PARENT; lp.height = statusBarHeight; statusView.setLayoutParams(lp); Log.d("rex", "statusBarHeight===" + statusBarHeight); } } if (navigationView != null) { if (getHasNavigationBar()) { navigationView.setVisibility(View.VISIBLE); int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); //动态获取NavigationBar的高度 int height = resources.getDimensionPixelSize(resourceId); ViewGroup.LayoutParams lp = navigationView.getLayoutParams(); lp.width = ViewGroup.LayoutParams.MATCH_PARENT; lp.height = height; navigationView.setLayoutParams(lp); Log.d("rex", "navigation_bar_height===" + height);// int resourceId2 = resources.getIdentifier("status_bar_height",// "dimen", "android");// int height2 = resources.getDimensionPixelSize(resourceId2);// Log.d("rex", "height2===" + height2); } else { navigationView.setVisibility(View.GONE); } } } protected abstract int onCreate();//返回主布局 protected abstract void initView(); public void initData() { } public <T> T Fid(int id) { T t = (T) findViewById(id); return t; } /** * 判断是否存在虚拟键盘 * * @return */ public boolean getHasNavigationBar() { boolean hasNavigationBar = false; Resources rs = getResources(); int id = rs.getIdentifier("config_showNavigationBar", "bool", "android"); if (id > 0) { hasNavigationBar = rs.getBoolean(id); } try { Class systemPropertiesClass = Class.forName("android.os.SystemProperties"); Method m = systemPropertiesClass.getMethod("get", String.class); String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys"); if ("1".equals(navBarOverride)) { hasNavigationBar = false; } else if ("0".equals(navBarOverride)) { hasNavigationBar = true; } } catch (Exception e) { } return hasNavigationBar; }}
1 0
- 沉浸式解决 任意修改状态栏 虚拟按键 背景和高度 测量虚拟按键高度 状态栏高度
- 获取虚拟按键、状态栏等高度;
- 获取虚拟按键、状态栏等高度
- android沉浸式状态栏和虚拟按键
- Android 解决沉浸式状态栏和华为虚拟按键冲突
- Android笔记之获得虚拟按键、状态栏高度
- 获得屏幕高度和虚拟按键高度
- android虚拟按键和状态栏的问题 沉浸式状态栏
- 获取状态栏和虚拟键高度
- Android 获取虚拟按键的高度
- android虚拟按键和沉浸式状态栏冲突等代码解决方案(eg:死坑华为)
- 自定义键盘,获取到屏幕高度,虚拟按键高度
- 状态栏高度和标题栏高度
- android 修改状态栏高度
- 关于虚拟按键和状态栏控制
- 状态栏和虚拟按键隐藏快捷方法
- 状态栏高度
- 状态栏高度 && 标题栏高度
- Java解析excel
- C#使用MemoryStream类读写内存
- 以@Resource为例,透析注解的本质,spring中是如何使用注解的
- openmp在多重循环内的简单使用及其详解
- 微信小程序服务器端用什么语言开发?
- 沉浸式解决 任意修改状态栏 虚拟按键 背景和高度 测量虚拟按键高度 状态栏高度
- Esri基础
- android中SELINUX规则分析和语法简介
- hdu 4430 Yukari's Birthday【二分】
- MD5加密工具类
- HDU 1171 Big Event in HDU (DP--01背包)
- 167. Two Sum II - Input array is sorted
- hive2.1.0安装部署
- pdf转jpg及pdf图片获取的方法