วิธีการตั้งค่า layout_gravity โดยทางโปรแกรม?


334

คำถามของฉันง่าย

ฉันจะตั้งค่า layout_gravity ของฉันโดยทางโปรแกรมได้อย่างไร

ฉันพบสิ่งนี้ทางอินเทอร์เน็ต แต่มันก็ทำให้ฉันมีข้อยกเว้น Nullpointer:

 Button MyButton = new Button(this);

    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 


    MyLinearLayout.addView(MyButton);

ทางออกใด ๆ


ฉันเชื่อว่าคุณต้องเพิ่มมุมมองลงในพาเรนต์ก่อนที่จะมี LayoutParams ที่ไม่ใช่ค่าว่าง
Morey รวย

คำตอบ:


545

ชวา

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

Kotlin

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}

สำหรับค่าแรงโน้มถ่วงและวิธีการตรวจสอบชุดแรงโน้มถ่วงแรงโน้มถ่วง

โดยทั่วไปคุณควรเลือกการLayoutParamsขึ้นกับผู้ปกครอง มันอาจจะเป็นRelativeLayout, LinearLayoutฯลฯ ...


1
ด้วยเหตุผลบางอย่าง params.gravity = 80 (ควรเป็น BOTTOM โดย te Docs) ไม่ทำงาน ฉันได้รับบางพื้นที่ระหว่างด้านล่างของมุมมองและข้อความ มันไม่ได้อยู่ในแนวเดียวกัน ...
อดัม Varhegyi

51
การรับค่าคงที่จากเอกสารนั้นผิดโปรดใช้ Gravity.TOP
Mariments

35
นี่คือ "แรงโน้มถ่วง" และเขาถามหา "layout_gravity" ??
M. Usman Khan

10
@usman ไม่นี้เป็นเรื่องเกี่ยวกับlayout_gravity(นั่นคือLayoutParams.gravity) gravityจะเป็นbutton.setGravity()
Floern

8
มีข้อมูลผิดพลาดมากมายเกี่ยวกับแรงโน้มถ่วงและ layout_gravity ที่นี่ใน SO หลายคนคิดว่านั่นsetGravity()คือ layout_gravity แต่มันผิด ฉันสามารถอนุมัติได้ว่าคำตอบนี้ถูกต้องสำหรับการตั้งค่า layout_gravity โดยทางโปรแกรม
Bevor

55

ฉันเกลียดที่จะคืนชีพเธรดเก่าอีกครั้ง แต่นี่เป็นปัญหาที่ไม่ได้รับคำตอบอย่างถูกต้องและยิ่งกว่านั้นฉันพบปัญหานี้ด้วยตัวเอง

นี่คือความยาวถ้าคุณเพียงแค่สนใจในคำตอบโปรดเลื่อนลงไปจนถึงรหัส:

android: แรงโน้มถ่วงและ android: layout_gravity ทำงานต่างกัน นี่คือบทความที่ฉันอ่านซึ่งช่วยฉันได้

รายการของบทความ: แรงโน้มถ่วงส่งผลกระทบต่อมุมมองหลังจากที่ได้รับมอบหมายความสูง / ความกว้าง ดังนั้นศูนย์แรงโน้มถ่วงจะไม่ส่งผลกระทบต่อมุมมองที่ดำเนินการ FILL_PARENT (คิดว่าเป็นระยะขอบอัตโนมัติ) layout_gravity center WILL ส่งผลกระทบต่อมุมมองที่เป็น FILL_PARENT (คิดว่าเป็น auto pad)

โดยพื้นฐานแล้ว Android: layout_gravity ไม่สามารถเข้าถึงโดยทางโปรแกรมได้เฉพาะ android: แรงโน้มถ่วง ในกรณีของ OP และกรณีของฉันคำตอบที่ยอมรับไม่ได้วางปุ่มตรงกลางในแนวตั้ง

เพื่อปรับปรุงคำตอบของ Karthi:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

การเชื่อมโยงLinearLayout.LayoutParamsไปยัง

android: layout_gravity แสดงความหมาย "ไม่มีวิธีการที่เกี่ยวข้อง" ไม่สามารถเข้าถึงแบบเป็นโปรแกรม ในขณะที่แรงโน้มถ่วงเป็นสนามในชั้นเรียน


นอกจากนี้เพื่อเพิ่มแรงโน้มถ่วงอัตโนมัติมาร์จิ้น (สำหรับการขาดระยะที่ดีกว่า) ตามการวางแนวของผู้ปกครอง LinearLayout ลิงค์บทความที่ให้ไว้จะช่วย
Uknight

21
MyButton.setGravity(Gravity.RIGHT);

สำหรับ layout_gravity ให้ใช้คำตอบที่ระบุโดย "karthi" วิธีนี้ตั้งค่าแรงดึงดูดให้วางลูกไว้ในมุมมอง


37
มันเป็นเพียงแรงโน้มถ่วงไม่ใช่เลย์เอาต์ _ แรงโน้มถ่วง
Adam Varhegyi

ตกลงแล้วบอกฉันว่า layout_gravity เท่ากับ setGravity แล้วฉันจะกำหนดแรงโน้มถ่วงได้อย่างไร?
Adam Varhegyi


5
การโพสต์เอกสารจำนวนมหาศาลไม่ได้แก้ปัญหาขออภัย
Adam Varhegyi

มองหาวิธี setGravity ในลิงค์ .. แต่การเปลี่ยนเส้นทางไปยังวิธีการที่แน่นอนไม่ทำงาน ..
Yashwanth Kumar

17

ฉันมีปัญหาคล้ายกันกับการตั้งโปรแกรม layout_gravity บนปุ่มใน GridLayout โดยทางโปรแกรม

เคล็ดลับที่เป็นแรงโน้มถ่วงบนชุด layoutParams ปุ่มหลังปุ่มถูกเพิ่มให้กับผู้ปกครอง (GridLayout) มิฉะนั้นแรงโน้มถ่วงจะถูกละเว้น

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

ฉันจะเปลี่ยน layout_gravity สำหรับ GridLayout ทั้งหมดได้อย่างไร
อิกบัล

15

หากคุณต้องการเปลี่ยนlayou_gravityมุมมองที่มีอยู่ให้ทำดังนี้

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

จำไว้ว่าให้ใช้สิทธิ์LayoutParamsตามประเภทเลย์เอาต์ที่คุณใช้อยู่

LinearLayout.LayoutParams

12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

ใช้สิ่งนี้เพื่อเพิ่มหมอมากกว่าหนึ่งแรงโน้มถ่วง


9

คำถามนี้เก่า แต่ฉันมีปัญหาเดียวกันและแก้ไขได้เช่นนี้

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

@ Muzikant .. ตกลง .. ฉันไม่ได้สังเกตเห็นก่อน .. แต่ตอนนี้มันชัดเจนสำหรับฉันขอบคุณ
Noman

สิ่งนี้ใช้งานได้โดยระบุรูปแบบของรูปแบบก่อนหรือไม่ ชอบ RelativeLayout.LayoutParams ... แทนที่จะเป็นแค่ LayoutParams
ryvianstyron

RelativeLayout.LayoutParams ใช้แฟล็กอื่นเพื่อตั้งค่าแรงโน้มถ่วงของมุมมอง (rightOf, centerInParent, centerVertical) วิธีแก้ปัญหานี้สำหรับเด็ก LinearLayouts
noni

6

KOTLIN ตั้งค่ามากกว่าหนึ่งแรงโน้มถ่วงบน FrameLayout โดยไม่มีการเปลี่ยนแปลงขนาด:

     // assign more than one gravity,Using the operator "or"
    var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
     // update gravity
    (pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
     // refresh layout
     pagerContainer.requestLayout()

ประหยัดเวลาของฉัน ... THX
BertKing

4

ฉันใช้ someting แบบนั้น: (Xamarin และ C # code)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

SetGravity ทำให้ textView ของฉันอยู่ตรงกลางของเลย์เอาต์ ดังนั้นคุณสมบัติเค้าโครงSetGravityอ้างถึงเนื้อหาเค้าโครง


4

ในกรณีที่คุณจำเป็นต้องตั้งค่า Gravity สำหรับมุมมองให้ใช้สิ่งต่อไปนี้

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

สำหรับการตั้งค่า layout_gravity สำหรับปุ่มให้ใช้ฟิลด์แรงโน้มถ่วงสำหรับเค้าโครงแบบเป็น

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

ลองนี้หวังว่านี้จะล้างขอบคุณ


3

ส่วนที่เหลือของคำตอบนั้นถูกต้องฉันต้องการเพิ่มการอธิบายเพิ่มเติม layout_gravity นั้นเกี่ยวกับวิธีวางตำแหน่งมุมมองในมุมมองพาเรนต์

คุณต้องตั้งค่าแรงโน้มถ่วง ** หลังจากเรียกใช้ parentView.addView () ** เราสามารถดูรหัส:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

และปัญหาของตัวชี้โมฆะคือเนื่องจากไม่ได้เรียกใช้ addView ก่อน getLayoutParams ()

คำอธิบายประกอบได้รับการกล่าวแล้วว่า "วิธีนี้อาจส่งคืนค่าว่างหากมุมมองนี้ไม่ได้เชื่อมต่อกับ ViewGroup หลักหรือ {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} ไม่ถูกเรียกใช้สำเร็จเมื่อติดมุมมองกับแม่ ViewGroup วิธีนี้จะต้องไม่ส่งคืนค่าว่าง "


บิตนี้ฉันด้วย ... ไม่ชัดเจนว่าคุณต้องตั้งค่าแรงโน้มถ่วงหลังจากเรียกว่า addView () คุณคิดว่าคุณจะตั้งค่าทุกอย่างในมุมมองใหม่แล้วเพิ่มมันเพื่อให้มันใช้งานง่าย :-P
kenyee

3

ถ้าคุณต้องการที่จะใส่มุมมองในใจกลางของผู้ปกครองคุณสามารถทำได้ด้วยรหัสต่อไปนี้ ..

public class myLayout extends LinearLayout {

    public myLayout(Context context) {
      super(context);

      RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.activity_main, null);
      LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      cc.gravity = Gravity.CENTER;
      this.setGravity(Gravity.CENTER);
      this.addView(vi);
  }
}

ส่วนรหัสเหล่านี้ทำให้ LinearLayout ใส่องค์ประกอบมุมมองแรกในศูนย์กลางของผู้ปกครอง ดังนั้นระบบของเราจะไม่พิจารณาความกว้างเริ่มต้นและสูงเพื่อจัดเรียงมุมมองในกึ่งกลาง ฉันทำส่วนรหัสได้ดี


i - ตัวเอียง))))
Artem


2

ทำงานอย่างสมบูรณ์แบบ !!! คำตอบข้างต้นไม่เหมาะกับฉัน ในไฟล์การตั้งค่าแรงโน้มถ่วง Xml และการตั้งค่า layout_gravity นั้นแตกต่างกัน ตรวจสอบรหัสด้านล่าง

// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
   messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new 
   FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
   params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
   messageLL.setLayoutParams(params);
   messageText.setVisibility(View.GONE);
   messageNoText.setVisibility(View.VISIBLE);
   messageLL.addView(messageNoText);

นอกจากนี้ให้เลือกที่นี่ซึ่งคุณสามารถดูคำอธิบายที่ชัดเจนเกี่ยวกับแรงโน้มถ่วงและ layout_gravity


1

คำตอบข้างต้นส่วนใหญ่ถูกต้องเขียนวิธีใช้ตัวช่วยเพื่อให้คุณสามารถใช้มันในโครงการของคุณโดยตรง

ตั้งlayout_gravityโปรแกรมโดยทางโปรแกรม

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.

// for single view
   public static void setLayoutGravity(int gravity, View view){
     ((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
    }


// for mulitple views
  public static void setLayoutGravity(int gravity, View ...view){
        for(View item : view)
            ((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
    }

0

ฉันเปลี่ยนจาก LinearLayout.LayoutParams เป็น RelativeLayout.LayoutParams จนได้ผลลัพธ์ที่ฉันต้องการในมุมมองวงกลมที่กำหนดเองที่ฉันสร้างขึ้น

แต่แทนที่จะใช้แรงโน้มถ่วงคุณใช้ addRule

RelativeLayout.LayoutParams mCircleParams = ใหม่ RelativeLayout.LayoutParams (วงกลมความสูง, ความสูงวงกลม);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);


0
 int width=getResources().getDisplayMetrics().widthPixels; 
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (width, width);

            params.gravity = Gravity.CENTER;

           iv_main_text = new HTextView(getContext());
            iv_main_text.setLayoutParams(params);
            iv_main_text.setBackgroundColor(Color.BLUE);
            iv_main_text.setTextSize(60);
            iv_main_text.setGravity(Gravity.CENTER);
            iv_main_text.setTextColor(Color.BLACK);

-1
FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.