1

У меня есть две аналогичные проблемы: оба связаны с ImageView, нажимая TextView (-ы) вокруг, и я не могу понять, почему. Для списка карточек я ищу, чтобы изображение соответствовало его родительскому значению, а ширина масштабируется соответствующим образом, а текст выравнивается по левому краю справа от изображения. Для всплывающего окна установите ширину в родительскую и масштабную высоту с текстом ниже.Избегайте Android вытаскивать элементы вне экрана в макете?

Current CardLayout output Current CardInfoLayout output

Что я ожидал/ищу:

enter image description here enter image description here

Текущий card_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="120dp" > 

<android.support.v7.widget.CardView 
    android:id="@+id/card_view" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_margin="10dp" 
    android:layout_height="120dp" 
    card_view:cardCornerRadius="4dp" 
    card_view:elevation="14dp"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <ImageView 
      android:id="@+id/image" 
      android:layout_height="match_parent" 
      android:layout_width="wrap_content" 
      android:scaleType="fitStart" 
      android:padding="4dp" 
      android:layout_gravity="left" 
      android:layout_weight="1"> 
     </ImageView> 

     <TextView 
      android:id="@+id/location" 
      android:textSize="16dip" 
      android:layout_toRightOf ="@+id/image" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 

      android:gravity="top" > 
     </TextView> 

     <TextView 
      android:id="@+id/abbreviation" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/location" 
      android:layout_toRightOf="@+id/image" 
      android:layout_toEndOf="@+id/image"> 
     </TextView> 

    </RelativeLayout> 
</android.support.v7.widget.CardView> 

</RelativeLayout> 

Текущий location_info_card.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<ImageView 
    android:id="@+id/info_image" 
    android:layout_height="0dp" 
    android:layout_width="match_parent" 
    android:scaleType="fitStart" 
    android:padding="10dp" 
    android:layout_weight="1"> 
</ImageView> 

<TextView 
    android:id="@+id/info_abbreviation" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="20sp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:paddingBottom="4dp"> 
</TextView> 

<TextView 
    android:id="@+id/info_location" 
    android:textSize="16sp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:paddingBottom="4dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</TextView> 
</LinearLayout> 

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

  1. Решение?
  2. Почему текст подталкивается к нижней части LinearLayout, а не появляется прямо под ним? Или почему он отталкивается от экрана в RelativeLayout при использовании wrap_content на ImageView и layout_toRightOf на TextView?

Относительно # 2, из-за ответов на подобные вопросы о SO, только отправляя решение, специфичное для этой проблемы, без каких-либо объяснений, я не могу применить его к моей ситуации. Я ищу ресурс, чтобы понять, как взаимодействуют макеты и представления (одиночные и вложенные), если объяснение будет слишком длинным для ответа.

+0

Вы должны использовать вложенный макет и использовать атрибуты веса :) – HelloSadness

+0

Для всплывающего окна попробуйте удалить 'layout_weight' в' ImageView' и установить его 'layout_height'' wrap_content'. – clownba0t

+0

Что касается карты, я пробовал свой макет на местном уровне, и это сработало для меня. Просто чтобы подтвердить, ясно видны ли текстовые представления, используя цвет шрифта, отличный от белого, и имеющий текст, который они должны отображать, правильно установленным программным путем? – clownba0t

ответ

0

Что касается макета card_layout.xml, похоже, что у вас просто нет вертикального выравнивания для верхнего TextView. У вас есть параметр , но это не то же самое, что и android:layout_gravity. Он устанавливает только, как отображается содержимое представления в пределах вид, он не позиционирует вид сам. Вы должны добавить строку, подобную `android: layout_alignTop =" @ id/image "вместо гравитации.

Что касается второго, вы установили высоту карты, чтобы она соответствовала родительской, поэтому нет ничего удивительного в том, что она заполняет весь экран. Вам нужно установить высоту всего (как макета, так и элементов внутри) до wrap_content и удалить атрибуты веса, они должны быть настроены на все виды, чтобы делать что-либо полезное в любом случае.

Еще одна важная вещь. Я заметил, что вы не указали android:adjustViewBounds на своих ImageView с. Вы должны установить его на true, в противном случае представления попытаются установить масштаб в зависимости от собственного размера, а не масштаба, чтобы сохранить соотношение сторон.

Что касается учебных материалов, я бы прочитал, как работают линейные и относительные макеты в целом, ваши проблемы не обязательно связаны с вложением вещей.К настоящему времени их много в Интернете, я уверен, что вы можете найти их сами. Также не бойтесь экспериментировать в Android Studio.

+0

Спасибо, хотя я все еще не совсем понимаю. Возможно, более конкретный вопрос: почему это происходит, когда у меня есть ImageView с wrap_content для height & width и scaleType: fitStart, вложенный внутри макета, который в какой-то момент имеет фиксированный размер, имеет ли ImageView массивное пространство справа от него? Я бы ожидал, что он масштабирует изображение до максимальной высоты, а затем будет иметь максимальную ширину изображения + дополнение, а не изображение + дополнение + ?? ... Если я задаю ширину явно, она работает точно так, как ожидалось , – Asmodean

+0

@Asmodean Я просто заметил, что вы также не указали 'android: adjustViewBounds' на своих представлениях, я обновил ответ. Надеюсь, это поможет. – Malcolm

Смежные вопросы