2017-01-29 4 views
0

У меня есть LinearLayout, который содержит TextView и ImageView. Ширина TextView равна wrap_content, но проблема заключается в том, когда ширина достигает ширины родителя. Текстовый контент будет правильно переноситься на две или более строк, но TextView и ImageView будут обрезаны с левой и правой сторон. Наиболее похожий вопрос, который я мог найти, был this one, который с 2013 года и не имеет решения.LinearLayout обрезание детей с шириной TextView, установленной на wrap_content

В частности, я испытываю проблему на this view, но я создал следующий простой вид для иллюстрации проблемы:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_top_holder" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/card_top_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="One Two Three Four Five" 
     android:textSize="40sp"/> 

    <ImageView 
     android:layout_width="24dp" 
     android:layout_height="24dp" 
     android:src="@drawable/ic_volume_up_black_48dp"/> 
</LinearLayout> 

Вот проблема: LinearLayout with children being clipped Вот макет нормально: LinearLayout without children being clipped

Когда макет перекрывает другой вид, установка android:clipChildren="false" на LinearLayout даже не предотвращает обрезку.

А вот один финальное изображение, чтобы доказать, что это происходит на реальном устройстве, а не только для просмотра макета: clipped views on a real device

Я в основном из идей. Есть предположения? Это проблема с системой компоновки Android? Спасибо за помощь и внимание!

ответ

1

Вы можете достичь желаемого результата с помощью android:layout_weight

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_top_holder" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/card_top_text" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="One Two Three Four Five" 
     android:textSize="40sp"/> 

    <ImageView 
     android:layout_width="24dp" 
     android:layout_height="24dp" 
     android:src="@drawable/ic_volume_up_black_48dp"/> 
</LinearLayout> 

Edit: Немного цитата из документации о том, как работает layout_weight

LinearLayout также поддерживает присвоение веса для отдельных детей с атрибутом android: layout_weight. Этот атрибут присваивает значение важности представлению с точки зрения того, сколько места он должен занимать на экране. Большее значение веса позволяет ему расширяться, чтобы заполнить любое оставшееся пространство в родительском представлении. Представления для детей могут указывать значение веса, а затем любое оставшееся пространство в группе просмотра назначается детям в пропорции их объявленного веса. Вес по умолчанию равен нулю.

Например, если есть три текстовых поля, и два из них объявляют вес 1, а другой не имеют веса, третье текстовое поле без веса не будет расти и будет занимать область, требуемую его содержимым , Остальные два будут одинаково расширяться, чтобы заполнить пространство, оставшееся после измерения всех трех полей. Если третьему полю присваивается вес 2 (вместо 0), тогда он объявляется более важным, чем другие, поэтому он получает половину всего оставшегося пространства, в то время как первые два разделяют остальные поровну.

+0

Да, это похоже на трюк. есть ли у вас какие-либо сведения о том, почему происходит отсечение, и почему это исправляет это? –