Подтвердить что ты не робот

Как установить ширину, которая равна другому виджету на Android

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

В моем приложении у меня есть текстовое представление ниже вида (горизонтальная линия). Ширина вида линии должна быть равна ширине текста. Я пробовал 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

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

4b9b3361

Ответ 1

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

<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" />

Ответ 2

Если вы используете макет, отличный от 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 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

Используйте 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>

Ответ 4

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

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

Ответ 5

Если вы не хотите использовать 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>

Ответ 6

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

Ответ 7

используйте следующий атрибут width.

 <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" />