วิธีการตั้งค่าคุณลักษณะ layout_weight แบบไดนามิกจากรหัส?


245

ฉันจะตั้งค่าlayout_weightสำหรับปุ่มสำหรับคุณลักษณะใน Android แบบไดนามิกจากรหัสจาวาได้อย่างไร?


มันจะคล้ายกับคำถาม / คำตอบนี้: stackoverflow.com/questions/4638832/ …และอันนี้: stackoverflow.com/questions/4637233/…
Rich Schuler

หากคุณได้กำหนดมุมมองในไฟล์ layout (xml) แล้วการสร้าง LayoutParams ใหม่จะเขียนทับ params อื่น ๆ ที่กำหนดไว้ในไฟล์ xml ดังนั้นก่อนอื่นคุณควรใช้ "getLayoutParams" ดูคำตอบแบบเต็มstackoverflow.com/questions/4641072/…
Shirish Herwade

คำตอบ:


463

คุณสามารถผ่านมันเป็นส่วนหนึ่งของตัวLinearLayout.LayoutParamsสร้าง:

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

พารามิเตอร์สุดท้ายคือน้ำหนัก


2
มันควรจะเป็นparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan

49
หากคุณไม่ต้องการที่จะเหวี่ยงจากคู่หนึ่งไปลอยให้ใส่ 1.0f
Xample

8
หรือวางได้ง่ายกว่า1fหากไม่มีตำแหน่งทศนิยม
sandalone

4
จะทำอย่างไรถ้าเลย์เอาต์ของผู้ปกครองคือRelative
Pratik Butani

9
@pratik หากรูปแบบของผู้ปกครองมีความสัมพันธ์กันคุณไม่ได้ใช้น้ำหนัก
invertigo

121

การใช้LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);

แก้ไข: อาคำตอบของอีริชง่ายกว่า!


27
ผู้สังเกตการณ์ของ Erich อาจเขียนได้ง่ายกว่า แต่คุณอ่านง่ายกว่า เนื่องจากมันบอกว่ามีคุณสมบัติที่ใช้สำหรับ 1.0f
Johan

3
คุณยอมรับว่าคุณสามารถแก้ไขน้ำหนักได้ทันทีโดยเรียก 'view.getLayoutParams ()' จากนั้นแก้ไขค่า
RobGThai

1
FILL_PARENTเลิกใช้แล้วและMATCH_PARENTควรใช้แทน
Simon Forsberg

2
@LocalPCGuy ไม่เป็นความจริง ตราบใดที่คุณกำหนดเป้าหมายเป็น SDK> = 8 (ซึ่งคุณควรเป็นอย่างยิ่ง) MATCH_PARENTสามารถใช้งานได้แทนที่จะใช้FILL_PARENTกับอุปกรณ์รุ่นเก่า
Kevin Coppock

2
@LocalPCGuy ไม่มีใครใช้ API 7 หรือน้อยอีกต่อไป ถ้าคุณกำลังพยายามที่จะทำให้แอปของคุณเข้ากันได้กับ API ที่ 7 หรือน้อยกว่าคุณอาจต้องการใช้เป็นจำนวนมากทั้งจากปัญหาอื่น ๆ ก่อนที่จะกังวลเกี่ยวกับFILL_PARENT MATCH_PARENT
Simon Forsberg

82

หากคุณกำหนดมุมมองของคุณในไฟล์เลย์เอาต์ (xml) ของคุณแล้วเท่านั้นต้องการเปลี่ยนน้ำหนักโดยทางโปรแกรมวิธีนี้จะดีกว่า

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

ใหม่ LayoutParams เขียนทับพารามิเตอร์อื่น ๆ ที่กำหนดไว้ในไฟล์ xml ของคุณเช่นระยะขอบหรือคุณต้องระบุทั้งหมดใน LayoutParams


2
ด้วย "params.weight = 1f;" คุณได้ตั้งค่าน้ำหนักในวัตถุ LayoutParams แล้ว ไม่จำเป็นต้องเรียก "mButton.setLayoutParams (params);"
MrMaffen

2
ไม่คุณต้องโทรแจ้ง setLayoutParams
SIr Codealot

1
นี่เป็นคำตอบที่งดงามที่สุดและมันเปลี่ยนวัตถุ UI ที่เจาะจงโดยตรง คำตอบที่ดีที่สุดก็ดีเช่นกันและเก่ากว่าโพสต์นี้ ดังนั้นจึงเป็นคำตอบที่ดีที่สุด ฉัน upvoted โพสต์นี้แม้ว่า
Android ดั้งเดิม

ทางออกที่ยอดเยี่ยมและเรียบง่าย!
Jeremy

ทำงานเหมือนจับใจ! ขอบคุณมาก :)
Vinay Vissh

26

หากตัวสร้างที่มีความกว้างความสูงและน้ำหนักไม่ทำงานลองใช้ตัวสร้างที่มีความกว้างและความสูง จากนั้นตั้งค่าน้ำหนักด้วยตนเอง

และถ้าคุณต้องการตั้งค่าความกว้างตามน้ำหนักให้ตั้งค่าความกว้างเป็น 0 ในตัวสร้าง เช่นเดียวกันกับความสูง รหัสด้านล่างใช้งานได้สำหรับฉัน

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);

parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);

สิ่งที่ฉันต้องการ! ทุกคนกำลังพูดถึงการตั้งค่าน้ำหนักไว้ที่นี่ไม่มีใครแสดงว่าเกิดอะไรขึ้นเมื่อเด็ก ๆ ที่ชั่งน้ำหนักถูกเพิ่มลงในมุมมองหลัก! จริง ๆ แล้วฉันกำลังมองหาวิธีเพิ่มน้ำหนักผลรวมบน ParentView! ขอบคุณ!
sud007

14

หากฉันมีคนมองหาคำตอบใช้สิ่งนี้:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

หากคุณกำลังเริ่มต้นเลย์เอาต์ของคุณจากไฟล์ xml สิ่งนี้จะสะดวกกว่าการให้พารามิเตอร์เลย์เอาต์ใหม่สำหรับ Linear Layout


นี่ควรเป็นคำตอบที่ยอมรับเพราะไม่ได้แก้ไขตัวแปรที่ตั้งไว้ก่อนหน้านี้เช่นความกว้าง / ความสูง / ระยะขอบ / การเว้นระยะห่าง ฯลฯ ทุกอย่างจะถูกเก็บไว้และนำกลับมาใช้ใหม่ในขณะที่น้ำหนักมีการเปลี่ยนแปลง
MrMaffen

1
หากมุมมองการตั้งค่าlayout_weightถูกวางไว้เรียบร้อยแล้วคุณต้องโทรView.requestLayout()เพื่ออัปเดต
Attacktive

6

ใด ๆLinearLayout.LayoutParamsและการทำงานสำหรับฉันสำหรับปุ่มหนึ่งที่เหมาะสมคือTableLayout.LayoutParams TableRow.LayoutParamsนั่นคือ:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

เกี่ยวกับการใช้MATCH_PARENTหรือWRAP_CONTENTเหมือนกัน


3
FILL_PARENTเลิกใช้แล้วและMATCH_PARENTควรใช้แทน
Simon Forsberg

ฉันคิดว่า LayoutParams.MATCH_PARENT ควรเปลี่ยนเป็น 0
CoolMind

คุณเรียกใช้LayoutParamsของผู้ปกครองโดยตรง ผมถือว่าคุณมีความผิดพลาดที่จะพยายามใช้โดยไม่ต้องปกครองLinearLayout.LayoutParams LinearLayout
รถเข็นที่ถูกละทิ้ง

4

หากคุณได้กำหนดมุมมองของคุณในไฟล์เลย์เอาต์ (xml) และต้องการเปลี่ยนน้ำหนักตามหลักไวยากรณ์แล้วสร้าง LayoutParams ใหม่เขียนทับพารามิเตอร์อื่น ๆ ที่กำหนดไว้ในไฟล์ xml ของคุณ

ดังนั้นก่อนอื่นคุณควรใช้ "getLayoutParams" และจากนั้น setLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);


3

หากlayoutparamsมีการกำหนดไว้แล้ว (เป็น XML หรือแบบไดนามิก) ต่อไปนี้เป็นรายการซับ:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

คำตอบที่ไม่ประเมิน
Adam Higgins

0

ใช้ Kotlin คุณสามารถทำสิ่งที่ชอบ:

import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*

import android.widget.LinearLayout

class RespondTo : CardView {
    constructor(context: Context) : super(context) {
        init(context)
    }

    private fun init(context: Context) {


        val parent = LinearLayout(context)

        parent.apply {
            layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply {
                orientation = LinearLayout.HORIZONTAL

                addView(EditText(context).apply {
                    id = generateViewId()
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply {
                    }
                })
                addView(ImageButton(context).apply({
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
                    background = null
                    setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
                    id = generateViewId()
                    layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT).apply {
                        addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
                        // addRule(RelativeLayout.LEFT_OF, myImageButton.id)
                    }
                }))
            }
        }
        this.addView(parent)
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.