Android适配底部虚拟按键的方法详解
最近项目进行适配的时候发现部分(如华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示,故调用虚拟按键隐藏方法使之隐藏,然而发现出现如下问题:
手动操作隐藏虚拟按键后出现长白条区域
不自动隐藏
滑出状态栏后虚拟按键也出来,状态栏隐藏后虚拟却不跟着隐藏
在没有虚拟按键的设备上影响了SurfaceView全屏显示图传(原本全屏显示的图传在切出去再进来时变成了小屏显示)
通过google了很多方法并尝试终于解决了这个问题,达到如下效果:
每次进入界面时虚拟按键自动隐藏
手动滑出虚拟按键,当不操作屏幕时定时自动隐藏
当滑出状态栏时虚拟按键会跟着出来,也要处理让其和状态栏在不操作时自动隐藏
具体代码如下操作:
publicclassTestActivityextendsAppCompatActivity{
privateViewdecorView;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//获取顶层视图
decorView=getWindow().getDecorView();
}
@Override
protectedvoidonStart(){
//调用配置
init();
super.onStart();
}
privatevoidinit(){
intflag=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//hide
|View.SYSTEM_UI_FLAG_FULLSCREEN//hidestatusbar
|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
//判断当前版本在4.0以上并且存在虚拟按键,否则不做操作
if(Build.VERSION.SDK_INT<19||!checkDeviceHasNavigationBar()){
//一定要判断是否存在按键,否则在没有按键的手机调用会影响别的功能。如之前没有考虑到,导致图传全屏变成小屏显示。
return;
}else{
//获取属性
decorView.setSystemUiVisibility(flag);
}
}
/**
*判断是否存在虚拟按键
*@return
*/
publicbooleancheckDeviceHasNavigationBar(){
booleanhasNavigationBar=false;
Resourcesrs=getResources();
intid=rs.getIdentifier("config_showNavigationBar","bool","android");
if(id>0){
hasNavigationBar=rs.getBoolean(id);
}
try{
Class>systemPropertiesClass=Class.forName("android.os.SystemProperties");
Methodm=systemPropertiesClass.getMethod("get",String.class);
StringnavBarOverride=(String)m.invoke(systemPropertiesClass,"qemu.hw.mainkeys");
if("1".equals(navBarOverride)){
hasNavigationBar=false;
}elseif("0".equals(navBarOverride)){
hasNavigationBar=true;
}
}catch(Exceptione){
}
returnhasNavigationBar;
}
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
returnfalse;
}
注:有些时候要手动去调用上述代码中init()配置方法隐藏按键。如弹出dialog时虚拟按键会出来,此时要手动调用隐藏,还有弹出键盘等等。
记录一下,以后遇到此类问题可供参考。
以上这篇Android适配底部虚拟按键的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。