这个问题专门针对带有MIUI的Xiomi设备的问题。
如何检测全屏模式(手势)或导航按钮(软导航)被选中?
我已经尝试了一些解决方案,但是可以在其他设备上使用,但不能在Xiomi或MIUI上使用。
我已尝试在SO上使用此解决方案,因此请提供另一个解决方案。
public boolean hasNavBar (Resources resources)
{
int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
return id > 0 && resources.getBoolean(id);
}
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);
if (hasBackKey && hasHomeKey) {
// no navigation bar, unless it is enabled in the settings
} else {
// 99% sure there's a navigation bar
}
View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
// TODO: The navigation bar is visible. Make any desired
// adjustments to your UI, such as showing the action bar or
// other navigational controls.
} else {
// TODO: The navigation bar is NOT visible. Make any desired
// adjustments to your UI, such as hiding the action bar or
// other navigational controls.
}
}
});
关于如何知道导航栏当前是否可见的任何想法?
我还尝试计算实际宽度和可用宽度,MIUI似乎总是返回导航栏的预留位置。
谢谢。
答案 0 :(得分:1)
对于全屏活动,无需检测“软输入”导航栏是可见还是隐藏,您可以创建样式并将样式应用于活动。
<style name="Theme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">false</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
并在活动中添加以下行:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
这导致您从软输入导航中停止布局重叠。
答案 1 :(得分:0)
我也有同样的问题。我找到了 2 个解决方案:
This 解决方案适用于 Android Q 以上版本。
public static int isEdgeToEdgeEnabled(Context context) {
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("config_navBarInteractionMode", "integer", "android");
if (resourceId > 0) {
return resources.getInteger(resourceId);
}
return 0;
}
如果此方法返回 2,则启用全屏模式。
2.This 解决方案适用于 Android Q 以上及以下的我:
ViewCompat.setOnApplyWindowInsetsListener(
findViewById(android.R.id.content)
) { _: View?, insets: WindowInsetsCompat ->
navigationBarHeight = insets.systemWindowInsetBottom
insets
}
我自己用了两种方法