Кнопка выравнивания по правому краю в горизонтальном LinearLayout


130

Если вы посмотрите на прикрепленное изображение. Мне нужно, чтобы моя кнопка была выровнена по правому краю, но по какой-то причине она не работает с 'gravity: right' ...

Отменить Добавить

Вот мой код для этого макета:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"
        android:layout_marginTop="9dp" />

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />

</LinearLayout>

Почему не работает ?!


6
В этом случае попробуйте относительный макет. LL не будет работать,
AAnkit

4
Если вы хотите использовать LinearLayout, используйте два внутренних linearlayout и используйте layout_weight вместе с layout_gravity. Это будет работать нормально.
Вамси Чалла

@VamsiChalla это возможно с одним, проверьте мой новый ответ ниже.
TWiStErRob

Ответы:


137

Используйте для этого код ниже

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="35dp"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="9dp"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="15dp"
        android:background="@drawable/stitch_button"
        android:text="@string/add" />

</RelativeLayout>

3
Кажется, что атрибут layout_alignParentRight недоступен для кнопки в этом случае? Может быть, устарело?

20
ru с использованием relativelayout вместо linearlayout?
Дипак Кешария

1
Ах, дерьмо .. Извините за это, я полностью игнорировал это. Спасибо!

4
Меня до сих пор удивляет, как то, что кажется таким простым, становится таким сложным при использовании линейного макета.
AlvaroSantisteban

2
@DipakKeshariya для будущих зрителей, вы можете использовать "android: layout_gravity =" top | right "linearlayout
SupimpaAllTheWay

145

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

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cancel"
        android:textColor="#404040"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"
        android:layout_marginTop="9dp" />

    <!-------------------------  ADDED SPACER VIEW -------------------->
    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1"
        />
    <!------------------------- /ADDED SPACER VIEW -------------------->

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />

</LinearLayout>

Обратите внимание на «подсвеченный» вид, больше я ничего не менял. Высота = 0 гарантирует, что это не будет видно. Ширина = 0, потому что ширина определяется на LinearLayoutоснове веса = 1. Это означает, что вид проставки будет максимально вытянут в направлении (ориентации) LinearLayout.

Обратите внимание, что вы должны использовать android.widget.Spaceили android.support.v4.widget.Spaceвместо,View если ваш уровень API и / или зависимости позволяют это. Spaceвыполняет работу более дешевым способом, потому что он только измеряет, а не пытается нарисовать что-то подобное View; это также более выразительно передает намерение.


2
Просто добавьте android: layout_weight = "1" в R.id.lblExpenseCancel и все.
hrules6872

1
@h_rules, который работает, если вы хотите взломать, но представьте, что произойдет, когда вы добавите фон в TextView.
TWiStErRob

2
Интересно, почему этот ответ получил отрицательные голоса, он работает и хорош, я обязательно попробую.
Эльведин Хамзагич

Это идеально для мобильного разработчика
Шивананд Дарур

Если добавить проставку, то при разных размерах экрана у вас будет разный результат. Так что это не идеальное решение.
GeoMint


28

Я знаю, что этот вопрос был задан некоторое время назад, но я делал это раньше, и он дает больше контроля при выравнивании элементов. Если вы посмотрите на это как на веб-программирование, это поможет. Вы просто вставляете другую LinearLayout, внутри которой будет ваша кнопка. Затем вы можете изменить гравитацию макета кнопки и сдвинуть ее вправо, покаTextView остается слева.

Попробуйте этот код:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"             
android:orientation="horizontal" 
android:layout_marginTop="35dp">

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancel" 
    android:textColor="#404040"         
    android:layout_marginLeft="10dp" 
    android:textSize="20sp" 
    android:layout_marginTop="9dp"/>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"                    
        android:text="@string/add" 
        android:layout_gravity="right" 
        android:layout_marginRight="15dp"/>

</LinearLayout>

Возможно, вам придется поиграть с отступом во вложенном макете, чтобы он действовал так, как вы хотите.


2
Вы должны использовать FrameLayout для вложенного макета. Позиционировать один-единственный элемент - вот для чего. А также присвойте ему вес, чтобы он заполнял правую часть родительского элемента. +1 за то, что все равно не использует относительный макет.
Hjalmar

10

Попробуй это

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_gravity="right" 
    android:layout_height="wrap_content"             
    android:orientation="horizontal"  >

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
   android:layout_height="wrap_content"   
   android:orientation="horizontal" >

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="9dp"
    android:text="cancel"
    android:textColor="#ffff0000"
    android:textSize="20sp" />

<Button
    android:id="@+id/btnAddExpense"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:layout_alignParentRight="true"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="15dp"
     android:textColor="#ff0000ff"
    android:text="add" />

 </RelativeLayout>
  </LinearLayout>

9

Как упоминалось пару раз ранее: переключение с LinearLayout на RelativeLayout работает, но вы также можете решить проблему, вместо того, чтобы ее избегать. Используйте инструменты, которые предоставляет LinearLayout: задайте TextView вес = 1 (см. Код ниже), вес вашей кнопки должен оставаться 0 или отсутствовать. В этом случае TextView займет все оставшееся пространство, которое не используется для отображения содержимого вашего TextView или ButtonView, и сдвинет вашу кнопку вправо.

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="35dp">

        <TextView
            android:id="@+id/lblExpenseCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/cancel"
            android:textColor="#404040"
            android:layout_marginLeft="10dp"
            android:textSize="20sp"
            android:layout_marginTop="9dp"

            **android:layout_weight="1"**

            />

        <Button
            android:id="@+id/btnAddExpense"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:background="@drawable/stitch_button"
            android:layout_marginLeft="10dp"
            android:text="@string/add"
            android:layout_gravity="right"
            android:layout_marginRight="15dp" />

    </LinearLayout>

2
Это лучший ответ. Я просто хотел написать что-то подобное, пока не нашел ваш пост.
codingdave

Это намного лучше, чем переключение на RelativeLayoutиз-за проблем с памятью, поскольку он RelativeLayoutпотребляет намного больше памяти, чемLinearLayout
ThunderWiring

7

Вам нужно добавить гравитацию к макету, а не к кнопке, гравитация в настройках кнопки предназначена для текста внутри кнопки

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_gravity="right" 
android:layout_height="wrap_content"             
android:orientation="horizontal" 
android:layout_marginTop="35dp">

2
Разве это не выровняло бы и TextView по правому краю? Мне просто нужно, чтобы кнопка была выровнена по правому краю ...

1
Если вам нужно выровнять только кнопку, используйте RelativeLayout.
goodm

1
Даже если вы хотите, чтобы все кнопки были выровнены, это не сработает (API 16). Дочерние виды по-прежнему выровнены по левому краю.
m0skit0

5
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"             
    android:orientation="horizontal" 
    android:layout_marginTop="35dp">

    <TextView
        android:id="@+id/lblExpenseCancel"
        android:layout_width="0dp"
        android:layout_weight="0.5"
        android:layout_height="wrap_content"
        android:text="@string/cancel" 
        android:textColor="#404040"         
        android:layout_marginLeft="10dp" 
        android:textSize="20sp" 
        android:layout_marginTop="9dp"/>              

    <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="0dp"
        android:layout_weight="0.5"
        android:layout_height="wrap_content"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"                    
        android:text="@string/add" 
        android:layout_gravity="right" 
        android:layout_marginRight="15dp"/>

</LinearLayout>

Это решит вашу проблему


3

Если вы не хотите или не можете использовать RelativeLayout, вы можете обернуть кнопку в LinearLayout с ориентацией «вертикальная» и шириной «fill_parent».

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:layout_marginTop="35dp">

  <TextView
      android:id="@+id/lblExpenseCancel"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/cancel"
      android:textColor="#404040"
      android:layout_marginLeft="10dp"
      android:textSize="20sp"
      android:layout_marginTop="9dp" />

  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">
     <Button
        android:id="@+id/btnAddExpense"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:background="@drawable/stitch_button"
        android:layout_marginLeft="10dp"
        android:text="@string/add"
        android:layout_gravity="right"
        android:layout_marginRight="15dp" />
  </LinearLayout>
</LinearLayout> 

Это связано с тем, что если ориентация LinearLayout горизонтальная, гравитация будет влиять только на виды по вертикали. А если ориентация «вертикальная», гравитация будет влиять на виды только по горизонтали. См. Здесь для получения более подробной информации об ориентации / гравитации LinearLayout.


2

Просто добавьте android: gravity = "right" в эту строку родительского макета, это будет работать.

<LinearLayout
        android:id="@+id/withdrawbuttonContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@color/colorPrimary"
        android:orientation="horizontal"
        **android:gravity="right"**
        android:weightSum="5"
        android:visibility="visible">

        <Button
            android:id="@+id/bt_withDraw"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/BTN_ADD"
            app:delay="1500" />

        <Button
            android:id="@+id/btn_orderdetail_amend"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/BTN_CANCEL"
            app:delay="1500" />
</LinearLayout>

0

Я использовал аналогичную раскладку с 4 TextViewс. Два TextViews должны быть выровнены по левому краю, а дваTextView должны быть выровнены по правой стороне. Итак, вот мое решение, если вы хотите использовать его LinearLayoutsсамостоятельно.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:baselineAligned="false"
    android:padding="10dp" >

    <LinearLayout
        android:layout_width="0dip"
        android:layout_weight="0.50"
        android:layout_height="match_parent"
        android:gravity="left"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_level"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/level"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_level_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dip"
        android:layout_weight="0.50"
        android:layout_height="match_parent"
        android:gravity="right"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/time"
            android:textAppearance="?android:attr/textAppearanceMedium"
             />

        <TextView
            android:id="@+id/textview_fragment_mtfstatus_time_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceMedium" 
            />
    </LinearLayout>

</LinearLayout>

0

Вы можете использовать RelativeLayout или установить gravity = "right" в родительском макете вашего Button.


0

Я знаю, что это старый, но вот еще один в линейном макете:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="35dp">

<TextView
    android:id="@+id/lblExpenseCancel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancel"
    android:textColor="#404040"
    android:layout_marginLeft="10dp"
    android:textSize="20sp"
    android:layout_marginTop="9dp" />

<Button
    android:id="@+id/btnAddExpense"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:background="@drawable/stitch_button"
    android:layout_marginLeft="10dp"
    android:text="@string/add"
    android:layout_gravity="center_vertical|bottom|right|top"
    android:layout_marginRight="15dp" />

Обратите внимание на layout_gravity, а не только на гравитацию.


Что с тобой center_vertical|bottom|top? Мне они кажутся исключительными гравитациями выравнивания.
TWiStErRob

0

Вы должны использовать Relativelayout вместо Linearlayout в качестве основного макета. Если вы используете Relativelayout в качестве основного, тогда легко обрабатывайте кнопку с правой стороны, потому что относительный макет предоставляет нам alignParent right, left, top и bottom.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.