ตั้งค่าระยะขอบใน LinearLayout แบบเป็นโปรแกรม


266

ฉันพยายามใช้ Java ( ไม่ใช่ XML ) เพื่อสร้าง LinearLayout ด้วยปุ่มที่เติมเต็มหน้าจอและมีระยะขอบ นี่คือโค้ดที่ทำงานโดยไม่มีระยะขอบ:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

เพื่อให้ใช้งานได้ดี แต่คุณจะให้ขอบปุ่มบนโลกได้อย่างไรจึงมีช่องว่างระหว่างกัน ฉันลองใช้LinearLayout.MarginLayoutParamsแต่ไม่มีweightสมาชิกดังนั้นมันจึงไม่ดี และมันจะไม่ทำงานถ้าคุณผ่านมันไปlpในตัวสร้างมัน

เป็นไปไม่ได้เหรอ? เพราะมันดูเหมือนว่ามันและมันจะไม่ใช่งานเลย์เอาต์ Android ชิ้นแรกที่คุณสามารถทำได้ใน XML เท่านั้น


1
developer.android.com/reference/android/view/… , int, int, int) แทน layoutParams.setMargins (30, 20, 30, 0); คุณใส่ layoutParams.setMargins (30dp, 20dp, 30dp, 0dp);
DarthestVader

3
setMargins ใช้ int เป็นอาร์กิวเมนต์ .. คุณสามารถระบุ "dp" โดยใช้ xml
actionstes ได้

คำตอบ:


496

นี่เป็นรหัสเล็กน้อยที่จะทำให้สำเร็จ:

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(30, 20, 30, 0);

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);

6
ขอบคุณสำหรับตัวอย่างโค้ด to-the-point - เป็นประโยชน์มากกว่าคำอธิบายเพียงอย่างเดียว
บางคนที่

25
ดูเหมือนว่าระยะขอบจะถูกกำหนดเป็นพิกเซล มีวิธีใดบ้างในการตั้งค่าเป็น dps
Artem Russakovskii

30
@ArtemRussakovskii เช่นเดียวกับฟังก์ชั่นส่วนใหญ่ใน Android พวกเขาใช้พิกเซล ฉันขอแนะนำฟังก์ชั่นยูทิลิตี้ระดับโลกที่แปลง dips เป็น px นี่คือสิ่งที่ฉันทำในแอพทั้งหมดของฉัน Android API sucks
mxcl

7
@ MaxHowell นั่นคือสิ่งที่ฉันทำลงไป มันน่าเหลือเชื่อที่บางครั้งสิ่งพื้นฐานที่ขาดหายไป
Artem Russakovskii

5
@ArtemRussakovskii - ใช้ TypedValue.applyDimension (... ) เพื่อแปลง DIP เป็น PX ดูstackoverflow.com/questions/2238883/…
Gautam

64

เพื่อให้ใช้งานได้ดี แต่คุณจะให้ขอบปุ่มบนโลกได้อย่างไรจึงมีช่องว่างระหว่างกัน

คุณเรียกsetMargins()บนLinearLayout.LayoutParamsวัตถุ

ฉันลองใช้ LinearLayout.MarginLayoutParams แต่นั่นไม่มีสมาชิกน้ำหนักดังนั้นจึงไม่ดี

LinearLayout.LayoutParamsเป็น subclass ของLinearLayout.MarginLayoutParamsตามที่ระบุไว้ในเอกสาร

เป็นไปไม่ได้เหรอ?

เลขที่

มันจะไม่ใช่งานเลย์เอาต์ Android ตัวแรกที่คุณสามารถทำได้ใน XML เท่านั้น

คุณสามารถแสดงหลักฐานการเรียกร้องนี้ได้

โดยส่วนตัวฉันไม่รู้อะไรเลยที่สามารถทำได้ผ่านทาง XML และไม่ได้ใช้วิธีการจาวาใน SDK ในความเป็นจริงตามคำนิยามทุกอย่างจะต้องสามารถทำได้ผ่านทาง Java (แต่ไม่จำเป็นต้องใช้วิธีการเข้าถึง SDK) เนื่องจาก XML ไม่ได้เป็นรหัสที่สามารถใช้งานได้ แต่ถ้าคุณรู้บางอย่างชี้ให้เห็นเพราะนั่นเป็นข้อบกพร่องใน SDK ที่ควรได้รับการแก้ไขสักวันหนึ่ง


2
ฮาตกลงฉันเข้าใจแล้ว การสูญเสียเล็กน้อยในระบบเลย์เอาต์ซึ่งค่อนข้างซับซ้อน ฉันไม่คิดว่าจะมีการตั้งค่า layout_widgth / height เมื่อใช้งานจริง
Timmmm

2
และไม่มีวิธีในการกำหนดสไตล์: stackoverflow.com/questions/2016249/…
Timmmm

1
LayoutPararmsฉันไม่ได้มีปัญหากับการตั้งค่าความกว้างและความสูงที่รันไทม์ผ่าน ฉันแง่ของรูปแบบ ... ใช่ดีมีเหตุผลที่ฉันไม่ได้ใช้ 'em :-)
CommonsWare

6
ฉันต้องการที่จะรู้ว่าทำไมมันจึงเป็น PITA ที่จะสร้าง UI โดยทางโปรแกรม
บางคนที่

3
เอาทุกวัยมาทำให้ฉันรู้ว่า infact ไม่กี่วันที่ผ่านมาฉันนำเข้า LayoutParams ผิดที่ไม่สนับสนุนระยะขอบ ... อ่านคำตอบเหล่านี้ฉันตัดสินใจที่จะลบการนำเข้าของฉัน มีมากกว่า 10 ตัวเลือก D: ฉันไปหา linearLayout.LayoutParams โรงงาน
Doomsknight

31

หากต้องการเพิ่มระยะขอบลงในรายการโดยตรง (บางรายการอนุญาตให้แก้ไขระยะขอบโดยตรง) คุณสามารถทำสิ่งต่อไปนี้

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

... สิ่งนี้ใช้ได้โดยไม่จำเป็นต้องทราบเกี่ยวกับ / แก้ไขเค้าโครงโดยรอบ สังเกตการ "อินสแตนซ์ของ" การตรวจสอบในกรณีที่คุณลองและเรียกใช้กับสิ่งที่ไม่สนับสนุนระยะขอบ


2
มันคือสิ่งที่ฉันกำลังมองหา
djdance

21

เนื่องจากความแตกต่างของพิกเซลหน้าจอของอุปกรณ์มีความหนาแน่นดีจึงใช้DIPหน่วยในการตั้งค่าระยะขอบโดยทางโปรแกรมเสมอ ชอบด้านล่าง

//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());

//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));

//set margin...
yourLayoutTOsetMargin.setLayoutParams(params); 

หวังว่าจะช่วยได้


10

ฉันได้ตั้งค่าระยะขอบโดยตรงโดยใช้รหัสด้านล่าง

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params);

สิ่งเดียวที่นี่คือการแจ้งให้ทราบว่าLayoutParamsควรนำเข้าแพคเกจต่อไปนี้android.widget.RelativeLayout.LayoutParamsมิฉะนั้นจะมีข้อผิดพลาด


7

ลองสิ่งนี้

 LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT,      
            LayoutParams.WRAP_CONTENT
    );
    params.setMargins(left, top, right, bottom);
    yourbutton.setLayoutParams(params);

7
 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);

2
“ ในขณะที่รหัสนี้อาจตอบคำถามได้ดีกว่าที่จะรวมคำอธิบายของรหัสที่นี่
xenteros

4

ลองสิ่งนี้:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;

3
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

คุณควรเป็นประเภทของ viewGroup ของมุมมองในโค้ดด้านบนตัวอย่างเช่นฉันต้องการเปลี่ยนระยะขอบของ frameLayout และกลุ่มมุมมองของ frameLayout นั้นเป็นRelativeLayoutดังนั้นคุณต้องแปลงเป็น(RelativeLayout.LayoutParams)


0

นี่คือโซลูชั่นบรรทัดเดียว:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.