Кнопка выравнивания по правому краю в горизонтальном 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>

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

ROMANIA_engineer
источник
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; это также более выразительно передает намерение.

TWiStErRob
источник
2
Просто добавьте android: layout_weight = "1" в R.id.lblExpenseCancel и все.
hrules6872
1
@h_rules, который работает, если вы хотите взломать, но представьте, что произойдет, когда вы добавите фон в TextView.
TWiStErRob
2
Интересно, почему этот ответ получил отрицательные голоса, он работает и хорош, я обязательно попробую.
Эльведин Хамзагич
Это идеально для мобильного разработчика
Шивананд Дарур
Если добавить проставку, то при разных размерах экрана у вас будет разный результат. Так что это не идеальное решение.
GeoMint
30

Реальное решение для этого случая:

android:layout_weight="1" для TextView, и ваша кнопка переместится вправо!

Николай Асинович
источник
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>

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

BobbyD17
источник
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>
NagarjunaReddy
источник
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">
goodm
источник
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.

HuynhHan
источник
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, а не только на гравитацию.

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

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

Фархан Гаффар
источник
-2

Используйте ширину макета в кнопке, например android: layout_width = "75dp"

Удалено из-за негатива
источник