ปุ่มจัดชิดขวาใน 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 เคยชิน
AAnkit

4
หากคุณต้องการใช้ LinearLayout ให้ใช้ linearlayouts ภายในสองตัวและใช้ 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 ใช้ relativelayout แทน linearlayout?
Dipak Keshariya

1
อ๊ะอ๊ะ .. ขอโทษนะที่ฉันมองผ่านไปแล้ว ขอบคุณ!

4
ยังคงทำให้ฉันประหลาดใจว่าบางสิ่งที่ดูเหมือนง่ายกลายเป็นเรื่องยากมากเมื่อพยายามใช้ linearlayout
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
ฉันสงสัยว่าทำไมคำตอบนี้ถึงได้รับการโหวตลงคะแนนได้ผลและดีฉันจะลองทำอย่างแน่นอน
Elvedin Hamzagic

ที่สมบูรณ์แบบในฐานะนักพัฒนามือถือ
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>

คุณอาจต้องเล่นโดยใช้ padding ในเค้าโครงที่ซ้อนกันเพื่อให้มันทำงานตามที่คุณต้องการ


2
คุณควรใช้ FrameLayout สำหรับเลย์เอาต์ที่ซ้อนกันของคุณ การวางตำแหน่งองค์ประกอบเดียวนั้นมีไว้เพื่ออะไร และให้น้ำหนักเพื่อเติมเต็มส่วนที่เหมาะสมของผู้ปกครอง +1 สำหรับการไม่ใช้ Relative Layout ต่อไป
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 a weight = 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: แรงโน้มถ่วง = "ขวา"เลย์เอาต์หลักของบรรทัดนี้ก็จะใช้ได้

<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วินาที สองTextViewวินาทีควรจัดชิดซ้ายและสอง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 หรือตั้งค่าแรงโน้มถ่วง = "ขวา" บนเค้าโครงหลักของปุ่มของคุณ


0

ฉันรู้ว่ามันเก่า แต่นี่คืออีกอันหนึ่งใน Linear Layout คือ:

<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 เป็นหลักให้จัดการปุ่มทางด้านขวาได้อย่างง่ายดายเนื่องจากการจัดวางแบบสัมพัทธ์ทำให้เราจัดชิดขวาซ้ายบนและล่าง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.