Как установить ширину, которая равна другому виджету на 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]()
пожалуйста, помогите мне.
Ответы
Ответ 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" />