Содержимое приложения выходит за панель навигации в android L
![enter image description here]()
Как вы можете видеть, моя кнопка "Got It" находится за панель навигации. Невозможно ее исправить!!! Я пробовал
<item name="android:fitsSystemWindows">true</item>
Как и установка его в файле макета.
Моя тема в значении -21:
<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:fitsSystemWindows">true</item>
</style>
В этом же случае все экраны во всем приложении.
Пожалуйста, помогите.
Ответы
Ответ 1
Вот решение.
Большинство макетов решаются путем добавления этих свойств в значение -21 style.xml
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:fitsSystemWindows">true</item>
для других, я подсчитал высоту навигационной панели и добавил маржу к моему представлению.
public static int getSoftButtonsBarSizePort(Activity activity) {
// getRealMetrics is only available with API 17 and +
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
if (realHeight > usableHeight)
return realHeight - usableHeight;
else
return 0;
}
return 0;
}
Примечание.. Используя приведенные выше решения, все работает, но я также использовал PopupWindow в своем приложении. Макет PopupWindow запутался в android L. Посмотрите на проблему и решение здесь
Ответ 2
Для приятной работы с пользователем вам не нужно блокировать область навигационных клавиш, используя android:windowTranslucentNavigation
скорее это лучшее решение, если вы используете библиотеку ResideMenu, а затем просто добавьте этот метод в ResideMenu.java
@Override
protected boolean fitSystemWindows(Rect insets) {
int bottomPadding = insets.bottom;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Resources resources = getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
bottomPadding += resources.getDimensionPixelSize(resourceId);
}
}
this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top,
viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + bottomPadding);
insets.left = insets.top = insets.right = insets.bottom = 0;
return true;
}
и если вы используете библиотеку SlidingMenu
, то измените mod на SLIDING_CONTENT
на:
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
Надеюсь, это сэкономит ваше время.
Ответ 3
Это так просто, просто добавьте эту строку в родительский макет XML:
android:fitsSystemWindows="true"
Ответ 4
Установка softInputMode
для popupWindow
в SOFT_INPUT_ADJUST_RESIZE
решает проблему.
Ответ 5
Просто установите это в свой Activity onCreate(), настроив представление контента:
int mScreenWidth = getWindowManager().getDefaultDisplay().getWidth();
int mScreenHeight = getWindowManager().getDefaultDisplay().getHeight();
View view = getLayoutInflater().inflate(R.layout.activity_main, null);
setContentView(view, new ViewGroup.LayoutParams(mScreenWidth, mScreenHeight));
Ответ 6
Используйте этот код в методе onCreate вашего Activity
(если у вас есть BaseActivity
, вы можете сделать это там, чтобы все действия применялись):
ViewCompat.setOnApplyWindowInsetsListener(
findViewById(android.R.id.content), (v, insets) -> {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
params.bottomMargin = insets.getSystemWindowInsetBottom();
return insets.consumeSystemWindowInsets();
});
Если макет имеет этот флаг, это означает, что этот макет просит систему применять вставки окна. В нашем случае это означало бы, что FrameLayout желает применить дополнение, равное высоте столбцов состояния.
Ответ 7
Работает для Android KitKat и выше (для тех, кто хочет, чтобы прозрачная строка состояния и не манипулировать NavigationBar)
Самый простой способ добиться этого:
Поместите эти 3 строки кода в styles.xml(v19)
→ если вы не знаете, как это сделать (v19), просто напишите их в вашем styles.xml
умолчанию и затем используйте alt+enter
чтобы автоматически создать его:
<item name="android:windowFullscreen">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:fitsSystemWindows">false</item>
А теперь перейдите к вашему классу MainActivity
и поместите этот метод из onCreate в класс:
public static void setWindowFlag(Activity activity, final int bits, boolean on) {
Window win = activity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
Затем поместите этот код в метод onCreate
в Activity:
if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);
}
if (Build.VERSION.SDK_INT >= 19) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
//make fully Android Transparent Status bar
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
Это!