解決思路是在dialog顯示的時(shí)候添加Flag,然后不獲取焦點(diǎn)矾利。
dialog的代碼
private void fullScreenImmersive(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN;
view.setSystemUiVisibility(uiOptions);
}
}
@Override
public void show() {
if (NavigationBarUtils.getNavigationBarHeight(getContext()) > 0) {
super.show();
} else {
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
super.show();
fullScreenImmersive(getWindow().getDecorView());
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
}
這里有一個(gè)坑姑裂,小米8,全面屏手機(jī)判斷是否顯示虛擬鍵的時(shí)候男旗。
在小米手機(jī)全面屏的情況下舶斧,直接判斷虛擬按鍵是否顯示的時(shí)候都是true,實(shí)際上展示的時(shí)候是沒有展示的察皇。因此這個(gè)坑需要特殊判斷茴厉。
判斷虛擬按鍵是否顯示的核心代碼如下
public class NavigationBarUtils {
/**
* 判斷虛擬導(dǎo)航欄是否顯示
*
* @param context 上下文對(duì)象
* @return true(顯示虛擬導(dǎo)航欄)泽台,false(不顯示或不支持虛擬導(dǎo)航欄)
*/
public static boolean checkNavigationBarShow(@NonNull 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 {
if (isMIUI()) {
//小米手機(jī)在全面屏的情況下,虛擬按鍵欄不展示矾缓,但是判斷出來(lái)是true ,而且還有高度怀酷,就專門換一種方式來(lái)判斷。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
hasNavigationBar = Settings.Global.getInt(context.getContentResolver(), "force_fsg_nav_bar", 0) == 0;
}
} else {
Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
Method m = systemPropertiesClass.getMethod("get", String.class);
String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
//判斷是否隱藏了底部虛擬導(dǎo)航
int navigationBarIsMin = 0;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
navigationBarIsMin = Settings.System.getInt(context.getContentResolver(),
"navigationbar_is_min", 0);
} else {
navigationBarIsMin = Settings.Global.getInt(context.getContentResolver(),
"navigationbar_is_min", 0);
}
if ("1".equals(navBarOverride) || 1 == navigationBarIsMin) {
hasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
hasNavigationBar = true;
}
}
} catch (Exception e) {
}
return hasNavigationBar;
}
/**
* 獲取 虛擬按鍵的高度
*
* @param context
* @return
*/
public static int getNavigationBarHeight(Context context) {
if (checkNavigationBarShow(context)) {
int totalHeight = getDpi(context);
int contentHeight = getScreenHeight(context);
return totalHeight - contentHeight;
} else {
return 0;
}
}
/**
* 獲取屏幕原始尺寸高度,包括虛擬功能鍵高度
*/
public static int getDpi(Context context) {
int dpi = 0;
WindowManager windowManager = (WindowManager)
context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, displayMetrics);
dpi = displayMetrics.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
/**
* 獲取屏幕高度 不包含虛擬按鍵
*/
public static int getScreenHeight(Context context) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
return dm.heightPixels;
}
/**
* 判斷是不是小米手機(jī)
*
* @return
*/
public static boolean isMIUI() {
String manufacturer = Build.MANUFACTURER;
// 這個(gè)字符串可以自己定義,例如判斷華為就填寫huawei,魅族就填寫meizu
if ("xiaomi".equalsIgnoreCase(manufacturer)) {
return true;
}
return false;
}
}
現(xiàn)在展示的交互的感覺比較好了餐塘。