我们在开发Android 的时候,尤其是适配,是真心觉得Android 头大,①各种状态栏,②小米的悬浮框权限会导致系统级别的WindowManager加载的view 不显示,尤其是Mi 5,Mi 6,③华为的虚拟按键,④魅族手机使用Videovie控件,会在魅族手机底部产黑条 ⑤ 华为手机插入USB 数据线通讯的时候,点击弹窗 是,则导致 不能正常通讯,必须点击否 采用Google 的AOA 协议 才可以避免弹窗提示!
看看,每个学Android 的人 都是天使,和IOS 那适配比起来,IOS 省了好多 机型适配的问题。
进入正题!
/*************************************************************************************
1.动态全屏显示
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
setFullSreenMode();
}
/**
* <P>Carplay 全屏显示</P>
*/
private void setFullSreenMode() {
int vis =
View.SYSTEM_UI_FLAG_FULLSCREEN | //全屏显示
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
getWindow().getDecorView().setSystemUiVisibility(vis);
}
2.在原生的Android 中,无法使用androidx等包自带的Them,并且修改v4,v7包代价大,或者无法修改的。
如下实例:
<style name="AppTheme" parent="android:Theme.Black">
第二个无法再V4,V7包下加载使用,因为这个是androidx自带的主题
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
想要实现对状态栏的一些操作,就只能琢磨自带属性
1. <item name="android:windowFullscreen">true</item> //可以实现全屏
2. <item name="android:windowNoTitle">true</item> //可以实现没有标题栏,默认为灰色细条条标题栏
3. <item name="android:windowBackground">@drawable/app_background</item> //设置为APP init时候的背景图
4. <item name="android:windowTranslucentNavigation">true</item> //可以非全屏模式下的透明导航栏 ,(除了全屏之外,这应该是最需要的一个)
/*************************************************************************************
1.状态栏的问题就很好解决,如果为了到达全屏!
首先去掉状态栏
<activity
android:name="com.gdu.mvp_view.ZorroRealControlActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<style name="Theme.NoTitleBar.Fullscreen">
<item name="windowFullscreen">true</item>
<item name="windowContentOverlay">@null</item>
</style>
就可以去掉了!
2.解决下方的虚拟按键NavigationBar
①首先判断是否有虚拟按钮
/**
* <P>shang</P>
* <P>判断是否有虚拟按键</P>
* @param context
* @return
*/
public static boolean checkDeviceHasNavigationBar(Context context) {
boolean hasNavigationBar = false;
Resources rs = context.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;
}
②就是开始去掉虚拟按键
@Override
protected void onResume() {
//解决 虚拟按键问题
solveNavigationBar(getWindow());
}
/**
* <P>shang</P>
* <P>解决虚拟按键问题</P>
* @param window
*/
public void solveNavigationBar(Window window){
//保持布局状态
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE|
//布局位于状态栏下方
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|
//全屏
View.SYSTEM_UI_FLAG_FULLSCREEN|
//隐藏导航栏
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
if (Build.VERSION.SDK_INT>=19){
uiOptions |= 0x00001000;
}else{
uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
window.getDecorView().setSystemUiVisibility(uiOptions);
}
实测有效!如上图Gif,达到王者荣耀 游戏界面效果!