This is the code I use to detect when the Keyboard Height
changes.
Only problem is that the Statur Bar
color disappears and turns white when this code runs.
ViewCompat.setOnApplyWindowInsetsListener(this.getWindow().getDecorView(), (v, insets) -> {
int keyboardHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom;
//Do your job here
Log.d("Keyboard height: ", String.valueOf(keyboardHeight));
SharedPreferences preferences = this.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
if (keyboardHeight > 0) {
bottom.getLayoutParams().height = 0;
editor.putInt("keyboard_height", keyboardHeight);
} else {
bottom.getLayoutParams().height = preferences.getInt("keyboard_height", 500);
}
editor.apply();
return insets;
});
Any alternative code that doesn't alter the Status Bar
color?
Or any way to programmatically re-add Status Bar
color after this code runs?
CodePudding user response:
You can solve this by consuming the insets dispatch event by returning WindowInsetsCompat.CONSUMED
instead of insets
This can be used during insets dispatch in the view hierarchy by returning this value from View.onApplyWindowInsets(WindowInsets) or onApplyWindowInsets to stop dispatch the insets to its children to avoid traversing the entire view hierarchy.
The application should return this instance once it has taken care of all insets on a certain level in the view hierarchy, and doesn't need to dispatch to its children anymore for better performance.
UPDATE:
This does work, seems like it just pushes the action bar up to the top of the screen, leaving the action bar higher than normally. But I guess I can just add some height and padding to the top of the action bar to prevent this.
Well, that does seem to make the activity full screen, even intersects with the navigation bar as well.
Now to fix that return the following instead:
ViewCompat.onApplyWindowInsets(v, insets)
ViewCompat.setOnApplyWindowInsetsListener(this.getWindow().getDecorView(), (v, insets) -> {
int keyboardHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom;
//Do your job here
Log.d("Keyboard height: ", String.valueOf(keyboardHeight));
SharedPreferences preferences = this.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
if (keyboardHeight > 0) {
bottom.getLayoutParams().height = 0;
editor.putInt("keyboard_height", keyboardHeight);
} else {
bottom.getLayoutParams().height = preferences.getInt("keyboard_height", 500);
}
editor.apply();
return ViewCompat.onApplyWindowInsets(v, insets);
});