Содержимое приложения выходит за панель навигации в 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);
    }

Это!