Col*_*ris 23 keyboard android view
使用以沉浸式模式在客户端的应用程序上工作,使用以下代码隐藏每个活动的导航栏和状态栏:
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);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是他们希望应用程序保持沉浸式模式,即使软键盘显示为输入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;
}
}
});
Run Code Online (Sandbox Code Playgroud)
小智 5
这是我的解决方案;首先我检查软键盘是否出现:
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
}
}
});
Run Code Online (Sandbox Code Playgroud)
当软键盘出现时,我有一个 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);
}
}
Run Code Online (Sandbox Code Playgroud)
这解决了在输入 Edittext 时获取导航栏的问题。
| 归档时间: |
|
| 查看次数: |
23904 次 |
| 最近记录: |