Как установить ширину, которая равна другому виджету на 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" /> ...... 

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

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

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

Solutions Collecting From Web of "Как установить ширину, которая равна другому виджету на Android"

Если вы используете 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" /> 

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

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

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

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

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

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

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