Android(安卓)隐藏底部虚拟键
16lz
2021-01-25
更新 新发现:android 4.4.4 直接(底部导航栏隐藏,切屏蔽了上划出现的问题)
getWindow().getDecorView().setSystemUiVisibility(4108);
但是在弹出软键盘或者拉下状态栏是还会出现
所以加了一个方法 禁止状态栏被点击(特殊需求才用到)
CustomViewGroup view; WindowManager manager; public void prohibitDropDown() { manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)); WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(); localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; localLayoutParams.gravity = Gravity.TOP; localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| // this is to enable the notification to recieve touch events WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | // Draws over status bar WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; localLayoutParams.height = (int) (50 * getResources() .getDisplayMetrics().scaledDensity); localLayoutParams.format = PixelFormat.TRANSPARENT; view = new CustomViewGroup(this); manager.addView(view, localLayoutParams); } /** * 允许下拉状态栏点击选项 */ public void allowDropDown(){ manager.removeView(view); } public class CustomViewGroup extends ViewGroup { public CustomViewGroup(Context context) { super(context); } @Override protected void onLayout(boolean b, int i, int i1, int i2, int i3) { } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return true; } } //系统ui变化监听(一般都是状态栏和导航栏) @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus);// getWindow().getDecorView().setSystemUiVisibility(options); }
方法一 滑动屏幕 可重新显示出来
protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); v.setSystemUiVisibility(View.GONE); } else if (Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); }}
方法二 滑动也不能重新显示
protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); v.setSystemUiVisibility(View.GONE); } else if (Build.VERSION.SDK_INT >= 19) { Window _window = getWindow(); WindowManager.LayoutParams params = _window.getAttributes(); params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE; _window.setAttributes(params); }}
方法三 亲测好用(监听系统UI变化实现)
protected void hideBottomUIMenu() {
//隐藏底部导航栏final View decorView = getWindow().getDecorView();final int uiOption = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_IMMERSIVE |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;decorView.setSystemUiVisibility(uiOption);// This code will always hide the navigation bardecorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener(){ @Override public void onSystemUiVisibilityChange(int visibility) { if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { decorView.setSystemUiVisibility(uiOption); } }});
}
//系统ui变化监听(一般都是状态栏和导航栏)@Overridepublic void onWindowFocusChanged(boolean hasFocus){ super.onWindowFocusChanged(hasFocus); getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |View.SYSTEM_UI_FLAG_IMMERSIVE |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);}
(如有发现问题,可以留言,私聊探讨。)
更多相关文章
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- android dex分包支持
- Android中如何实现WebView与JavaScript的相互调用
- android 点击退出程序
- Android(安卓)WebView使用基础
- android系统中的多线程(二): 关于在work thread中对UI进行更新和
- android2D
- Android中的ClassLoader
- android View的点击事件分发机制的简单认知