Кнопка праворуч вирівняти в горизонтальній лінії LinearLayout


130

Якщо ви подивитеся на додане зображення. Мені потрібна моя кнопка, щоб вона була точно вирівняна, але чомусь вона не працює з "гравітацією: правильно" ...

Скасувати Додати

Ось мій код для цього макета:

<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
звичайна

4
Якщо ви хочете використовувати LinearLayout, використовуйте два внутрішні лінійні верстви та використовуйте layout_weight разом із layout_gravity. Це буде добре працювати.
Vamsi Challa

@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, використовуючи relalayout замість linearlayout?
Діпак Кешарія

1
Ах дерьмо .. Вибачте за це, я повністю переглянув це. Дякую!

4
Мене все ще дивує, як щось, що здається таким простим, стає таким складним, намагаючись використовувати лінійний проміжок.
Альваро Сантіштебан

2
@DipakKeshariya для майбутніх глядачів, ви можете використовувати "android: layout_gravity =" верхній | правий "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
Цікаво, чому ця відповідь отримала зворотну оцінку, вона працює і це приємно, я спробую її точно.
Ельведін Гамзагіч

Це ідеально, як розробник мобільних пристроїв
Shivanand Darur

Якщо ви додасте спейсер, то в різних розмірах екрана ви отримаєте різний результат. Тож це не ідеальне рішення.
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 з орієнтацією "вертикаль" та шириною "заливки_прозорої".

<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 повинні бути вирівняні вліво і два TextViews повинні бути вирівняні праворуч. Отже, ось моє рішення, якщо ви хочете використовувати 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" на батьківському макеті вашої кнопки.


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

В якості основного макета ви повинні використовувати відносний розміщення замість Linearlayout. Якщо ви використовуєте Relativelayout в якості основної, то легко обробляйте кнопку з правого боку, оскільки відносне розташування дає нам вирівняти параметр "Праворуч, зліва", "вгорі та внизу".


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.