正在使用沉浸式模式的客户端应用程序使用以下代码隐藏每个活动的导航栏和状态栏:
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
final int flags = 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
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
// This work only for android 4.4+
if (currentApiVersion >= 19) {
getWindow().getDecorView().setSystemUiVisibility(flags);
// Code below is for case when you press Volume up or Volume down.
// Without this after pressing valume buttons navigation bar will
// show up and don't hide
final View decorView = getWindow().getDecorView();
decorView
.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
decorView.setSystemUiVisibility(flags);
}
}
});
}
唯一的问题是,即使软键盘显示要在EditText中键入内容,他们也希望该应用程序保持在沉浸式模式下并且不显示导航栏。有人能想到一种即使在使用键盘时也始终隐藏导航按钮(后退/隐藏键盘,主屏幕等)的方法吗?
我想出了一种变通方法,它检查每个内部导航栏的状态,尝试将其隐藏并再次(并再次检查)。
这里有一些代码,可确保在关闭软键盘后2秒钟内隐藏了导航栏。
private final Runnable checkSystemUiRunnable = new Runnable() {
@Override
public void run() {
checkHideSystemUI();
}
};
private void checkHideSystemUI() {
// Check if system UI is shown and hide it by post a delayed handler
if (isSystemUiShown) {
hideSystemUI();
handler.postDelayed(checkSystemUiRunnable, SYSTEM_UI_HIDE_DELAY);
}
}
private void hideSystemUI() {
decorView.setSystemUiVisibility(
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 nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
// In onCreate()
decorView.setOnSystemUiVisibilityChangeListener(
new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
handler.postDelayed(checkSystemUiRunnable, SYSTEM_UI_HIDE_DELAY);
isSystemUiShown = true;
} else {
isSystemUiShown = false;
}
}
});
请参见this。我已经搜索了3个多小时来解决此问题,该解决方案效果很好。希望对您有所帮助。
这是我的解决方案;首先,我检查了是否显示软键盘:
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
int screenHeight = getWindow().getDecorView().getRootView().getHeight();
int keypadHeight = screenHeight - r.bottom;
//Log.d(TAG, "keypadHeight = " + keypadHeight);
if (keypadHeight > screenHeight * 0.15) {
//Keyboard is opened
hideNavBar();
}
else {
// keyboard is closed
}
}
});
而且当显示软键盘时,我有一个hideNavBar()方法要触发。
private void hideNavBar() {
if (Build.VERSION.SDK_INT >= 19) {
View v = getWindow().getDecorView();
v.setSystemUiVisibility(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
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
这解决了在要输入Edittext时获取导航栏的问题。
更新:
我有一个绘画应用程序(Paint Shapes),这是我以前始终处于沉浸式模式下的配置。我使用onWindowFocusChanged
方法。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().getDecorView().setSystemUiVisibility(
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
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
我认为这是不可能的。在这里
陈述清楚,我的经验似乎证实了这一点。
以下代码置于活动中
private var appVisibility:Int = ( View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_LOW_PROFILE
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
window.decorView.systemUiVisibility = appVisibility
}
override fun onResume() {
super.onResume()
updateUI()
}
fun updateUI() {
val decorView = window.decorView
decorView.setOnSystemUiVisibilityChangeListener { visibility ->
if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
decorView.systemUiVisibility = appVisibility
}
}
}
总是正确隐藏导航栏(当您从屏幕底部滑动时,导航栏会显示几秒钟,然后消失),但是当键盘处于打开状态时。我还尝试以编程方式打开键盘,然后在几秒钟后隐藏导航栏,但没有成功。
private fun toggleIME(){
val imm = applicationContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
val view: EditText? = text
if(view != null && imm != null) {
isKOpen = !isKOpen
if (isKOpen) {
view.requestFocus()
imm.showSoftInput(view, InputMethodManager.SHOW_FORCED)
handler.postDelayed(Runnable { // execute after XXXms
updateUI()
window.decorView.systemUiVisibility = appVisibility
}, 5000)
}
else {
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}
}
我希望能丢失一些东西。对于开发的自定义键盘,我将需要它(必须在其中实现后退按钮)