น้ำหนักเค้าโครง Android


84

ฉันยังใหม่กับการพัฒนา Android และมีคำถามเกี่ยวกับการกำหนดน้ำหนักในเลย์เอาต์เชิงเส้น

ฉันกำลังพยายามสร้างแถวที่มีปุ่มกำหนดเองสองปุ่มและข้อความแก้ไขแบบกำหนดเอง ข้อความแก้ไขควรใช้พื้นที่มากพอ ๆ กับเนื้อหาและปุ่มทั้งสองควรขยายในแนวนอนเพื่อเติมเต็มพื้นที่ว่างที่เหลือในแถว แบบนี้...

| [#Button++#] [#Button--#] [et] |

หลังจากพยายามหลายครั้งนี่เป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับสิ่งที่ต้องการแม้ว่ามันจะดูซับซ้อนเกินไปก็ตาม

| [Button] [Button] [###ET###] |

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal|center_vertical"
    android:layout_weight="1"
    >

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_plus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_plus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/tv_dice_plus" 
                android:text="@string/tv_plus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_minus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_minus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/btn_minus" 
                android:text="@string/tv_minus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <EditText 
            android:textColor="#FAFAF4"
            android:text="@string/et_output" 
            android:id="@+id/et_output" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:inputType="number"
            android:selectAllOnFocus="true" 
            android:minWidth="50sp"         
            android:maxWidth="50sp"
            android:background="@drawable/tv_black_background3"
            android:textColorHighlight="#c30505"
            ></EditText>
    </LinearLayout>
</LinearLayout>

ตามที่ฉันเข้าใจการตั้งค่า [android: layout_weight = "2"] สำหรับเลย์เอาต์เชิงเส้นที่ถือปุ่มควรทำให้ใช้พื้นที่มากกว่าข้อความแก้ไข แต่จะตรงกันข้ามกับฉันทำให้ทั้งสองมีขนาดเล็กลงครึ่งหนึ่ง

| [Btn] [Btn] [#####et#####] |

ฉันได้ลองชุดต่างๆมากมายจนแทบจำไม่ได้และไม่มีเลย

คำตอบ:


213

ไม่ได้ผลเนื่องจากคุณใช้ Fill_parent เป็นความกว้าง น้ำหนักจะใช้เพื่อกระจายพื้นที่ว่างที่เหลืออยู่หรือใช้พื้นที่ว่างเมื่อผลรวมมีค่ามากกว่า LinearLayout ตั้งค่าความกว้างของคุณเป็น0dipแทนและจะได้ผล


6
การตั้งค่าความกว้างของเลย์เอาต์เชิงเส้นเป็น 0dip ได้ผลตามที่ฉันต้องการ ฉันไม่รู้ว่านั่นเป็นตัวเลือก มันสมเหตุสมผลแล้วว่าทำไมมันถึงใช้งานได้โดยที่ wrap_content ทำไม่ได้ การตั้งค่าความกว้างเป็น wrap_content เมื่อไม่มีเนื้อหาจะทำให้เนื้อหานั้นหายไป แต่การตั้งค่าเป็น 0dip จะช่วยให้สามารถขยายจากสิ่งใดเลยไปยังขนาดที่ใหญ่กว่าได้ ขอบคุณมาก.
UnluckyDevil

การตั้งค่า layout_width เป็น "fill_parent" และ layout_weight เป็นค่า float เช่น "0.2", "0.85" เป็นต้นก็ใช้ได้เช่นกัน ในกรณีนี้ยิ่งตัวเลขมีขนาดใหญ่เท่าใดการดูก็จะยิ่งน้อยลงเท่านั้น คุณช่วยอธิบายได้ไหมว่านี่เป็นวิธีที่ยอมรับได้หรือไม่
ยาร์

37
สิ่งนี้ได้ผลสำหรับฉันเช่นกัน ขอขอบคุณ. (แม้ว่าฉันจะต้องบอกว่ามีใครบ้างที่พบว่าระบบเลย์เอาต์ของ Android แปลกและไม่เข้าใจง่าย)
tstyle

ขอบคุณ! ฉันมีปัญหาในการบอกว่าทำไมความกว้างเค้าโครงของฉันไม่แสดงตามที่คาดไว้ มันเป็นการตั้งค่า 0dip ที่ทำได้ :)
marlar

@tstyle android เป็นเรื่องง่ายถ้าคุณต้องการทำสิ่งที่ง่าย อย่างไรก็ตามหากคุณต้องการทำมากกว่าเรื่องง่าย ๆ มันก็ยากเกินไป
Pacerier

14

android:Layout_weightสามารถใช้เมื่อคุณไม่ได้แนบค่าแก้ไขกับความกว้างของคุณเช่นfill_parentฯลฯ

ทำสิ่งนี้:

<Button>

Android:layout_width="0dp"
Android:layout_weight=1

-----other parameters
</Button>

7

คิดแบบนั้นจะง่ายกว่า

หากคุณมีปุ่ม 3 ปุ่มและน้ำหนักเท่ากับ 1,3,1 มันจะทำงานเหมือนตารางใน HTML

ระบุ 5 ส่วนสำหรับบรรทัดนั้น: 1 ส่วนสำหรับปุ่ม 1, 3 ส่วนสำหรับปุ่ม 2 และ 1 สำหรับปุ่ม 1


3

ใน linearLayout ตั้งค่า WeightSum = 2;

และกระจายน้ำหนักให้กับลูกของมันตามที่คุณต้องการให้แสดง .. ฉันให้น้ำหนัก = "1" กับเด็กดังนั้นทั้งสองจะกระจายครึ่งหนึ่งของทั้งหมด

 <LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/maila_oss" />
</LinearLayout>

2

ค่าน้ำหนัก 0-1 แบ่งการกระจายของพื้นที่ว่าง (หลังจากตั้งค่า layout_width = "0px") ตามสัดส่วนของค่าน้ำหนัก ดูองค์ประกอบที่ไม่ได้ระบุน้ำหนัก (ไม่มีการป้อนน้ำหนัก) รับน้ำหนัก 0 ซึ่งหมายความว่าไม่มีการขยายตัว

ทางเลือกง่ายๆที่ไม่จำเป็นต้องมีรายการน้ำหนักคือการแนบกระโจมเข้ากับมุมมองที่มีข้อความซึ่งบอกให้ขยายจากขั้นต่ำที่จำเป็นสำหรับข้อความ (wrap_content) เป็นพื้นที่ว่าง EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"


0

ฉันคิดว่าจะตั้งค่าEditTextความกว้างwrap_contentและใส่สองปุ่มลงในLinearLayoutความกว้างfill_parentและน้ำหนักที่กำหนดไว้ที่ 1


0

อีกเหตุผลหนึ่งที่ฉันพบ (คลุมเครือเพราะอาจฟังดูดี) ด้านล่างใช้งานไม่ได้

LinearLayout แนวตั้ง

LinearLayout ความสูง Fillparent + น้ำหนัก

LinearLayout ความสูง Fillparent + น้ำหนัก

LinearLayout ความสูง Fillparent + น้ำหนัก

EndLinearLayout

สิ่งที่ได้ผลคือ

RelativeLayout

LinearLayout แนวตั้ง

LinearLayout ความสูง Fillparent + น้ำหนัก

LinearLayout ความสูง Fillparent + น้ำหนัก

LinearLayout ความสูง Fillparent + น้ำหนัก

EndLinearLayout

EndRelativeLayout

มันฟังดูคลุมเครือด้วยเลย์เอาต์รูทที่มี Linear และน้ำหนักที่อยู่ข้างใต้ก็ไม่ได้ผล และเมื่อฉันพูดว่า "ใช้ไม่ได้" ฉันหมายความว่าหลังจากที่ฉันดูเค้าโครงกราฟิกระหว่างความละเอียดต่างๆแล้วความสม่ำเสมอของหน้าจอก็พังทลายลงครั้งใหญ่


0
<LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="9"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
<EditText
        android:id="@+id/edittxt"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
</LinearLayout>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.