1

У меня есть RelativeLayout с параметром высоты match_parent и в этом случае у меня есть еще LinearLayout с недвижимостью layout_alignParentBottom=true.Android Lollipop Design Issue

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

Ниже то, что я ожидал, чтобы иметь в MediaController

enter image description here

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

enter image description here

компоновка прячется за нижний BAC k панель кнопок.

Что будет лучшим способом предоставить только необходимый запас снизу в соответствии с высотой нижней панели, поскольку этот макет отлично работает в других версиях 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> 

App Theme

<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> 
+0

Это не имеет никакого смысла, панель кнопок не является частью обычного экрана, и выравнивание родительского дна не влияет на это. Вы уверены, что у вас нет отрицательного нижнего поля или подобного? Или, может быть, контейнер над игроком выталкивает его из экрана? – breakline

+0

@breakline Хорошо, в эти дни я сталкиваюсь с проблемами, которые странны. Да, я уверен, нет отрицательного поля или подобного. Я разместил свой XML-файл. – gprathour

+0

Вы попробовали layout_gravity -> center? Btw публикует полный xml со всеми компонентами, его легче анализировать вашу проблему. – Xplouder

ответ

0

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

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

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

+1

Я просто добавил 'context' в XML, упомянутый в вопросе. Также я попытался дать 'android: fitsSystemWindows =" true "' для корневого элемента, но не повезло. – gprathour

+0

@gprathour Я не говорил о 'tools: context', но о стиле/теме/конфигурации Activity, имеющем этот вид (' MyActivity') –

+0

Просто добавила тему приложения к вопросу. Это то, о чем вы просили? – gprathour

0

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

Не проверен метод самостоятельно, но обратная связь кажется положительной.

+1

Хм .. Спасибо. Я прошел через такие варианты, но задавался вопросом, можем ли мы узнать, почему происходит такая вещь, и какой-либо подлинный способ решить эту проблему, а не просто взломать. – gprathour

+0

Извинения, я пропустил линию, в которой вы сказали, что вы уже закодировали маржу. Не могли бы вы поделиться стилями, которые вы используете? Поскольку мне кажется, что он ведет себя так же, как режим наложения для панели действий, просто на дне. Может быть, есть ключ к тому, почему там. – MattMatt

0

Вы можете использовать высоту и ширину отображения по умолчанию в своем макете следующим образом: Для вас это параметры 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); 
0

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

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); 
0

Привет @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> 

Надеется, что это помогает.