Проблема с дизайном Android Lollipop

У меня есть RelativeLayout с параметром высоты match_parent, а в этом у меня есть еще LinearLayout со свойством layout_alignParentBottom=true.

Я использую этот макет для отображения MediaController кнопок.

Ниже то, что я ожидаю получить в MediaController

введите здесь описание изображения

Но ниже то, что я получаю на Lollipop 5.1 (я только что добавил жестко закодированное нижнее поле в макет, что вовсе не является решением, поскольку оно не будет хорошо работать на всех устройствах).

введите здесь описание изображения

Макет скрывается за нижней задней панелью кнопок.

Каким будет лучший способ обеспечить только необходимое поле снизу в соответствии с высотой нижней панели, поскольку этот макет отлично работает в других версиях Android и более ранних телефонах Android с аппаратными кнопками возврата.

Мой файл XML выглядит так

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mypack.MyActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/bottomLinear"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/albumArt"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:layout_gravity="center"
            android:background="@drawable/default_cover" />

        <TextView
            android:id="@+id/titleOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Title Of Song"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/albumOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Album Of Song"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/artistOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Artist Of Song"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/genreOfSong"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="3"
            android:text="Genre Of Song"
            android:textSize="18sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/bottomLinear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >
    </LinearLayout>

</RelativeLayout>

Тема приложения

<style name="AppBaseTheme" parent="Theme.AppCompat"></style>
<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowAnimationStyle">@null</item>
</style>

person gprathour    schedule 28.06.2015    source источник
comment
На самом деле это не имеет смысла, панель кнопок не является частью обычного экрана, и это не влияет на выравнивание родительского нижнего края. Вы уверены, что у вас нет отрицательного нижнего поля или подобного? А может контейнер над плеером выталкивает его за пределы экрана?   -  person breakline    schedule 28.06.2015
comment
@breakline В последнее время я сталкиваюсь со странными проблемами. Да, я уверен Нет отрицательной маржи или чего-то подобного. Я разместил свой файл XML.   -  person gprathour    schedule 28.06.2015
comment
Вы пробовали layout_gravity -> center? Кстати, опубликуйте полный xml со всеми компонентами, так будет проще проанализировать вашу проблему.   -  person Xplouder    schedule 28.06.2015
comment
@Xplouder Я разместил полный файл XML. Центр гравитации? Почему мне нужно показать это внизу.   -  person gprathour    schedule 28.06.2015
comment
Вы нашли решение?   -  person Angie    schedule 17.07.2015
comment
@Энджи Нетупс. Только что предоставили жестко запрограммированное нижнее поле до сих пор. Если я получу решение, я опубликую его здесь. Если получится, выложи сюда.   -  person gprathour    schedule 19.07.2015


Ответы (5)


Кажется, что ваша активность каким-то образом использует прозрачную тему панели навигации или что-то подобное, что позволяет отображать вид за пределами видимой области.

Возможно, предоставление некоторого контекста вашей деятельности поможет выяснить, что именно происходит.

При этом вы должны использовать этот атрибут android:fitsSystemWindows в корне вашего макета XML, чтобы заставить представления отображаться только в видимой области окна.

person Simon Marquis    schedule 28.06.2015
comment
Я только что добавил context в XML, упомянутый в вопросе. Также я пытался передать android:fitsSystemWindows="true" корневому элементу, но безуспешно. - person gprathour; 28.06.2015
comment
@gprathour Я говорил не о tools:context, а о стиле/теме/конфигурации действия, содержащего это представление (MyActivity) - person Simon Marquis; 28.06.2015
comment
Просто добавил тему приложения к вопросу. Это то, о чем вы просили? - person gprathour; 28.06.2015
comment
Да, но конфигурация Activity была бы плюсом. Устанавливаете ли вы флаги видимости для вида оформления Activity? Или делать такие вещи, как developer.android.com/training/system-ui/navigation. HTML? - person Simon Marquis; 28.06.2015
comment
Я только что добавил requestWindowFeature(Window.FEATURE_NO_TITLE);, кроме этого ничего подобного. Где я могу найти конфигурацию деятельности? - person gprathour; 28.06.2015

Если вы хотите оставить все остальное без изменений и просто добавить нижнее поле, этот ответ описывает способ получения высоты нижней панели программных клавиш путем вычитания getRealMetrics() и getMetrics() и использования разницы для подразумеваемого измерение высоты.

Сам метод не проверял, но отзывы положительные.

person MattMatt    schedule 28.06.2015
comment
Хм.. Спасибо. Я просмотрел такие варианты, но мне было интересно, можем ли мы выяснить, почему это происходит, и какой-либо реальный способ решить эту проблему, а не просто взломать. - person gprathour; 28.06.2015
comment
Извините, я пропустил строку, где вы сказали, что уже жестко закодировали поля. Не могли бы вы поделиться стилями, которые вы используете? Как мне кажется, он ведет себя так же, как режим наложения для панели действий, только внизу. Там может быть ключ, почему там. - person MattMatt; 28.06.2015

Вы можете использовать высоту и ширину defaultDisplay в своем макете следующим образом: Для вас это параметры RelativeLayout.

    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    android.widget.FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) yourUI.getLayoutParams();
    params.width = metrics.widthPixels;
    params.height = metrics.heightPixels;
    params.leftMargin = 0;
    yourUI.setLayoutParams(params);
person Angie    schedule 20.07.2015

Я решил эту проблему, установив программно высоту макета, равную высоте дисплея.

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int height = size.y;
int statusBarHeight = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
      statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
RelativeLayout relativeLayout =(RelativeLayout)findViewById(R.id.relativeLayout);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)relativeLayout.getLayoutParams();
lp.height = height - statusBarHeight;
relativeLayout.setLayoutParams(lp);
person Mikhail    schedule 29.04.2016

Привет @gprathour, попробуй это

<LinearLayout
        android:id="@+id/bottomLinear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="?attr/actionBarSize"
        android:orientation="horizontal" >
    </LinearLayout>

Надеюсь это поможет.

person mdb    schedule 28.06.2017