Как создать макет, в котором длина кнопки не меньше длины TextView?

#android #android-layout #android-linearlayout #android-relativelayout

#Android #android-layout #android-linearlayout #android-relativelayout

Вопрос:

Я пытаюсь достичь следующего:

  • Мне нужно разместить Button вид где-нибудь в макете
  • TextView Прямо над этим Button должно быть то, что используется в качестве метки
  • Размер Button должен зависеть от размера TextView . Поскольку приложение локализовано, ширина текста не фиксирована, а зависит от локализованного текста, который используется в качестве метки.
  • Button Должно быть мин. ширина 150dp. Если ширина TextView больше этого, Button она должна иметь ту же ширину, что и TextView .

Это должно выглядеть примерно так:

 Short Label
 ------------- 
 ------------- 

Very Long Label Text
 ------------------ 
 ------------------ 
  

Я пробовал разные решения с LinearLayout или RelativeLayout в качестве корневого макета, но проблема всегда одна и та же: я не смог подогнать ширину Button к ширине TextView . Предоставление Button минимальной ширины 150dp, конечно, не проблема. Но как решить второй случай с длинной меткой?

 <SomeRootLayout ...>
    <!-- also tried LinearLayout, but problem is the same... -->
    <RelativeLayout
        android:id="@ id/editTextAndLabelContainer"
        ...>

        <TextView
            android:id="@ id/labelTV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="A " />

        <Button
            android:id="@ id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@ id/labelTV" />
    </RelativeLayout>
</SomeRootLayout>
  

Если Button имеет ширину «match_parent», ширина не выравнивается TextView , а устанавливается на полную ширину экрана.

Как я могу это решить?

Комментарии:

1. сделай это programatically..by getwidth() для textview … и если больше, то установите ширину для кнопки такой же, как для textview….

Ответ №1:

 <RelativeLayout
        android:id="@ id/editTextAndLabelContainer"
        ...>

        <TextView
            android:id="@ id/labelTV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="A " />

        <Button
            android:id="@ id/button"
            android:layout_alignLeft="@ id/labelTV" //<== add this line
            android:layout_alignRight="@ id/labelTV" //<== add this line
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@ id/labelTV" />
    </RelativeLayout>
  

Комментарии:

1. Большое вам спасибо! Я не знал, что разные выравнивания могут быть объединены… Это решение работает отлично!

Ответ №2:

Ok..do что-то вроде: layout:

  <LinearLayout
    android:id="@ id/editTextAndLabelContainer"
    android:weightSum="2"
    ...>

    <TextView
        android:id="@ id/labelTV"
        android:layoutWeight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="A " />

    <Button
        android:id="@ id/button"
        android:layoutWeight="1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@ id/labelTV" />
</LinearLayout>
  

Или как предлагает Лена..

И в вашем Java-коде: добавьте TextWatcher в свой метод textview ontextchange .. и в side after textchange метод сделайте что-то вроде:

 int txtWidth = your_textViw.getWidth();
int btnWidth = your_button.getWidth();

if(txtWidth >= btnWidth)
  your_button.setWidth(txtWidth);