Как установить ширину, которая равна другому виджету на Android - PullRequest
36 голосов
/ 02 апреля 2012

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

В моем приложении у меня есть текстовое представление под видом (горизонтальная линия). Ширина вида строки должна быть равна ширине textview . Я пробовал Android: layout_width = "wrap_content" и "match_parent", что не решает проблему.

Это пример XML-кодирования:

         ......
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="28dp"
            android:text="PopUpWindow"
            android:textAppearance="?android:attr/textAppearanceLarge" />


            <View
                android:id="@+id/separator"
                android:layout_width="wrap_content"
                android:layout_height="0.3dp"
                android:layout_below="@+id/textView1"
                android:background="#ffffff" />
             ......

изображение на экране:

enter image description here

пожалуйста, помогите мне.

Ответы [ 7 ]

86 голосов
/ 02 апреля 2012

Если вы используете RelativeLayout, вы можете использовать align -атрибуты:

<View
    android:id="@+id/separator"
    android:layout_width="0dp"
    android:layout_height="0.3dp"
    android:layout_below="@+id/textView1"
    android:layout_alignLeft="@+id/textView1"
    android:layout_alignRight="@+id/textView1"
    android:background="#ffffff" />
6 голосов
/ 12 мая 2013

Если вы используете Layout, отличный от RelativeLayout, вы можете программно сопоставить ширину ваших виджетов, например, в этом примере:

layout.xml:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Here's some text"
        />

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some more text"
        />
</LinearLayout>

Обратите внимание, что оба текстовых поля установлены на wrap_content.

Main.java:

TextView tv1 = (TextView) findViewById(R.id.text1);
TextView tv2 = (TextView) findViewById(R.id.text2);

if(tv1.getWidth() < tv2.getWidth())
    tv1.setWidth(tv2.getWidth());
else
    tv2.setWidth(tv1.getWidth());

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

if(tv2.getWidth() < button)
    tv2.setWidth(button.getWidth());
else
    button.setWidth(tv2.getWidth());
3 голосов
/ 02 апреля 2012

Используйте RelativeLayout и используйте эти два атрибута в горизонтальной проекции

 android:layout_alignLeft="@+id/textView1"     android:layout_alignRight="@+id/textView1"




<RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.23" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="67dp"
            android:text="this is TextView" />


        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="10dp"
            android:layout_alignLeft="@+id/textView1"
            android:layout_alignRight="@+id/textView1"
            android:layout_below="@+id/textView1"
            android:background="#FF0000"
            android:text="" />

    </RelativeLayout>
2 голосов
/ 08 июля 2016

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

  <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical|left"
        android:orientation="vertical"
        android:layout_gravity="center_vertical"
        android:padding="5dp">

        <TextView
            android:id="@+id/navHeaderName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/profile_progress_bar"
            android:text="This is a large text"
            android:textAppearance="@style/TextAppearance.AppCompat.Body1" />


        <ProgressBar
            android:id="@id/profile_progress_bar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="100"
            android:progress="45" />
    </LinearLayout>
2 голосов
/ 24 декабря 2014

То, что сказал Джейв, правильно - и самое простое, но что, если вы не используете RelativeLayout для хранения представлений?

Если вы настраиваете свой пользовательский интерфейс в onCreate (), тогда вы 'Вы обнаружите, что получение ширины из другого виджета даст вам неверный результат!Это потому, что пользовательский интерфейс еще не настроен.

Но вы все равно можете настроить свой пользовательский интерфейс в onCreate ... просто запустите код, который выполняется после настройки пользовательского интерфейса.Это достигается с помощью команды View.post().

XML:

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

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center">

        <Button
            android:id="@+id/button_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="short string" />

        <Button
            android:id="@+id/button_two"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="this is a longer string" />

    </LinearLayout>

</RelativeLayout>

Java-код:

private Button mButtonOne;
private Button mButtonTwo;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // inflate UI
    setContentView(R.layout.activity_example);

    // get references to UI elements
    mButtonOne = (Button)findViewById(R.id.button_one);
    mButtonTwo = (Button)findViewById(R.id.button_two);

    // Make buttons the same size (i.e. Button1.width = Button2.width)
    if ((mButtonOne != null) && (mButtonTwo != null))
    {
        mButtonOne.post(new Runnable()
        {
            @Override
            public void run()
            {
                mButtonOne.setWidth(mButtonTwo.getWidth());
            }
        });
    }
}

В результате ширина button_one будет соответствовать ширине button_two.Это приятнее, когда объем текста сильно различается между двумя представлениями.

0 голосов
/ 02 апреля 2012

использовать следующий атрибут ширины.

 <TextView
        android:id="@+id/textView1"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="28dp"
        android:text="PopUpWindow"
        android:textAppearance="?android:attr/textAppearanceLarge" />


        <View
            android:id="@+id/separator"
            android:layout_width="150dp"
            android:layout_height="0.3dp"
            android:layout_below="@+id/textView1"
            android:background="#ffffff" />
0 голосов
/ 02 апреля 2012

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

<LinearLayout android:orientation="vertical" ... > <!-- layout parameters as appropriate-->
<TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="28dp"
        android:text="PopUpWindow"
        android:textAppearance="?android:attr/textAppearanceLarge" />


        <View
            android:id="@+id/separator"
            android:layout_width="match_parent"
            android:layout_height="0.3dp"
            android:layout_below="@+id/textView1"
            android:background="#ffffff" />

 </LinearLayout>
...