Как использовать wrap_content с максимальной шириной?

Я пытаюсь развернуть представление, которое должно обернуть его содержимое, но оно должно быть не более чем на ~ 100dp меньше его родительской ширины. Как я могу это сделать с помощью RelativeLayout или другого макета? То, что у меня сейчас, всегда будет выглядеть на 100dp меньше, чем у его родителя, так что есть место для другого представления.

Это изображение является примером того, что у меня есть:

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

Как вы можете видеть, текст не заполняет весь ящик, поэтому он может быть меньше. Но он никогда не должен быть больше, чем на 100dp меньше, чем его родитель, так что есть место для времени отправки сообщения.

Это мой макет.

<?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="wrap_content"
    android:clipChildren="false"
    android:orientation="vertical"
    android:paddingBottom="10dp"
    android:paddingRight="@dimen/horizontalMargin"
    android:paddingTop="10dp">


    <TextView
        android:id="@+id/message_holder"
        android:layout_toLeftOf="@id/blank"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="@dimen/horizontalMargin"
        android:background="@drawable/message_corners"
        style="@style/white_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="alsdkjf; alsdkf" />

    <RelativeLayout
        android:id="@+id/blank"
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_alignParentRight="true"
        android:minWidth="100dp">

    </RelativeLayout>

    <TextView
        android:minWidth="100dp"
        android:id="@+id/time"
        style="@style/gray_text"
        android:layout_toRightOf="@id/message_holder"
        android:paddingLeft="10dp"
        android:text="Yesterday,\n11:30 PM" />


    <RelativeLayout
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignBottom="@id/message_holder"
        android:layout_alignParentLeft="true"
        android:background="@drawable/triangle" />

</RelativeLayout>

Я попытался использовать свойство "minWidth" в пустом представлении справа от окна сообщения, чтобы обеспечить интервал, но размер не изменяется больше (что сделает окно сообщения меньше). Когда у меня нет пустого представления и просто поставьте время TextView справа от окна сообщения, тогда TextView не будет виден, когда окно сообщения будет расширяться.

Update:

Это мой "message_corners.xml":

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">


    <solid
        android:color="@color/green" >
    </solid>


    <padding
        android:left="10dp"
        android:top="10dp"
        android:right="10dp"
        android:bottom="10dp"    >
    </padding>


    <corners
        android:radius="10dp">
    </corners>

</shape>

Обновление 2:

Это то, что я ищу в макете с коротким текстом:

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

И это то, что я ищу в макете с длинным текстом:

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

Ответ 1

Здесь вы идете, макет, который делает именно то, что вы хотите.

<?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="wrap_content"
    android:clipChildren="false"
    android:paddingBottom="10dp"
    android:paddingRight="10dp"
    android:paddingTop="10dp">


    <RelativeLayout
        android:id="@+id/blank"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#aaaaaa">
        <LinearLayout
            android:id="@+id/message_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingRight="100dp">
            <TextView
                android:id="@+id/message"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello?"
                android:background="#00ff00" />
        </LinearLayout>

        <TextView
            android:id="@+id/time"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/message_container"
            android:layout_marginLeft="-100dp"
            android:text="12:30 PM"
            android:background="#ff0000" />
    </RelativeLayout>

</RelativeLayout>

Короткое сообщение Короткое сообщение

Длинное сообщение Длинное сообщение

Ответ 2

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

Поскольку вы фактически не знаете ширину всего экрана, вы не можете сказать, что ваш TextView будет на 100dp меньше, чем он. То, что вам нужно сделать, - это обернуть TextView в контейнер, который будет иметь правило toLeftOf, при этом TextView только обертывает его содержимое. Таким образом, контейнер будет расширяться до конца (без переполнения времени TextView) , но TextView будет только обернуть его текстовое содержимое (так что он выиграл ' t расширять любые пробелы)

код

Вместо

<TextView
        android:id="@+id/message_holder"
        android:layout_toLeftOf="@id/blank"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="@dimen/horizontalMargin"
        android:background="@drawable/message_corners"
        style="@style/white_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="alsdkjf; alsdkf" />

Использование

<LinearLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"       
 android:layout_toLeftOf="@id/blank"
 android:layout_alignParentLeft="true"
 android:layout_marginLeft="@dimen/horizontalMargin">

     <TextView
          android:id="@+id/message_holder"
          android:background="@drawable/message_corners"
          style="@style/white_text"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="alsdkjf; alsdkf" />
</LinearLayout>

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

Ответ 3

Вы можете попробовать следующее расположение представлений и их ширину:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:padding="6dp"
        >
    <FrameLayout
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content">
        <TextView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:background="@android:color/holo_blue_bright"
                tools:text="Some long test is this which is support to wrap at the end of parent view"
                />
    </FrameLayout>
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="6dp"
            tools:text="Yesterday,\n 11:30 PM"
            />
</LinearLayout>

Ответ 4

Как я понимаю, вы хотите, чтобы макет или текстовое изображение были на 100 dp меньше размера экрана Что вы можете сделать, получив ширину экрана в пикселях, что делает это

Display display  = getWindowManager().getDefaultDisplay();
 Point size = new Point();
 display.getSize(size);
 int width = size.x;
 int height = size.y;

Тогда вы можете установить ширину textbiew меньше 100dp из размера экрана, надеюсь, эта помощь  P.s Я думаю, вы можете конвертировать dp в px, но я не уверен

Ответ 5

Если вы хотите, чтобы текст времени справа и текстовое сообщение слева от него, вы можете сделать что-то подобное (используя это в относительной компоновке), вы также можете использовать maxWidth, а не minWidth

<TextView
        android:id="@+id/view_textView_timeText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/view_textView_timeText"
        android:maxWidth="100dp"/>

Ответ 6

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

Ответ 7

Вы можете сделать это (не прямой ответ на вопрос):

 <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="bottom"
    android:orientation="horizontal">


    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="1"
            android:paddingLeft="45px"
            android:text="asdfadsfsafasdfsakljkljkhjhkkhjkjhjkjhjkhjkhljkhlkhjlkjhljkhljkhlkjhljkhljkhlfasd"
            android:textColor="#4a4a4a"
            android:textSize="40px" />
    </LinearLayout>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:paddingLeft="45px"
        android:paddingRight="48px"
        android:text="2017.08.09 13:00"
        android:textColor="#9b9b9b"
        android:textSize="34px" />
</LinearLayout>

Ответ 8

Я знаю, что это действительно старый вопрос, но это неприятная проблема, с которой я столкнулся несколько раз, и существующие ответы не совсем то, что я искал. Некоторые коллеги и я придумали следующее:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="#FFFFFF">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#888888"
        android:padding="10dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#00FF00"
            tools:text="Short message."/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="0"
            android:background="#CCCCCC"
            tools:text="Yesterday,\n11:30pm"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="#888888"
        android:padding="10dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/message_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#00FF00"
            tools:text="Super ultra mega awesome long message which is going to help us take over the world."/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="0"
            android:background="#CCCCCC"
            tools:text="Yesterday,\n11:31pm"/>

    </LinearLayout>

</LinearLayout>

Что выглядит при визуализации:

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

Магия кажется нулевым значением для веса текстового поля справа (в дополнение к ненулевому значению веса текстового поля слева, которое уже есть в некоторых других ответах).

Честно говоря, я не могу точно объяснить, почему это работает, но после долгого поиска решения этого вопроса я не ставил под сомнение это!:)

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