Làm cách nào để thiết lập layout_gravity theo chương trình?


333

Câu hỏi của tôi rất đơn giản,

Làm cách nào để đặt các nút layout_gravity của tôi theo chương trình?

Tôi đã tìm thấy điều này trên internet, nhưng nó chỉ đơn giản ném cho tôi một ngoại lệ Nullpulum:

 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);

Bất kì giải pháp nào?


Tôi tin rằng bạn cần thêm chế độ xem cho cha mẹ của nó trước khi nó sẽ có LayoutParams không phải là null.
Rich Morey

Câu trả lời:


544

Java

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
}

Để biết giá trị trọng lực và cách đặt trọng lực, hãy kiểm tra Trọng lực .

Về cơ bản, bạn nên chọn LayoutParamstùy thuộc vào cha mẹ. Nó có thể RelativeLayout, LinearLayoutv.v ...


1
Vì một số lý do params.gravity = 80 (Nó phải là BOTTOM, bởi te Docs) chỉ không hoạt động. Tôi có một số không gian nằm phía dưới cùng của Chế độ xem và Văn bản. Nó không quá thẳng hàng ...
Adam Varhegyi

51
Lấy giá trị không đổi từ tài liệu đơn giản là sai, vui lòng sử dụng Gravity.TOP
Maragues

35
đây là "trọng lực" và anh ta yêu cầu "layout_gravity" ??
M. Usman Khan

10
@usman không, đây là về layout_gravity(đó là LayoutParams.gravity). Các gravitysẽbutton.setGravity()
Floern

8
Có rất nhiều thông tin sai về trọng lực và layout_gravity ở đây trên SO. Nhiều người nghĩ rằng đó setGravity()là layout_gravity, nhưng điều này là sai. Tôi có thể chấp nhận rằng câu trả lời này là chính xác để thiết lập layout_gravity theo chương trình.
Bevor

54

Tôi ghét phải làm sống lại các chủ đề cũ nhưng đây là một vấn đề không được trả lời chính xác và hơn nữa tôi đã tự mình gặp vấn đề này.

Đây là một đoạn dài, nếu bạn chỉ quan tâm đến câu trả lời, vui lòng cuộn toàn bộ mã xuống:

android: vity và android: layout_gravity hoạt động khác nhau. Đây là một bài báo tôi đã đọc giúp tôi.

GIST của bài viết: trọng lực ảnh hưởng đến chế độ xem sau khi chiều cao / chiều rộng được chỉ định. Vì vậy, trung tâm trọng lực sẽ không ảnh hưởng đến chế độ xem được thực hiện FILL_PARENT (nghĩ về nó như lề tự động). layout_gravity centre SILL ảnh hưởng đến chế độ xem đó là FILL_PARENT (nghĩ về nó như là pad tự động).

Về cơ bản, android: layout_gravity KHÔNG THỂ truy cập theo chương trình, chỉ android: trọng lực. Trong trường hợp của OP và trường hợp của tôi, câu trả lời được chấp nhận không đặt nút ở giữa theo chiều dọc.

Để cải thiện câu trả lời của Karthi:

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

Liên kết đến LinearLayout.LayoutParams.

android: layout_gravity hiển thị "Không có phương thức liên quan" nghĩa là không thể truy cập theo chương trình. Trong khi đó trọng lực là một lĩnh vực trong lớp.


Ngoài ra, để thêm vào tỷ lệ lợi nhuận tự động trọng lực đó (vì không có thuật ngữ tốt hơn) dựa trên định hướng của cha mẹ tuyến tính. Các liên kết bài viết được cung cấp sẽ giúp.
Uknight 12/11 '

21
MyButton.setGravity(Gravity.RIGHT);

Đối với layout_gravity, hãy sử dụng câu trả lời được nêu bởi "karthi". Phương pháp này đặt trọng lực để đặt trẻ em vào trong tầm nhìn.


37
Nó chỉ là trọng lực, không phải layout_gravity.
Adam Varhegyi

Được rồi sau đó cho tôi biết nếu layout_gravity bằng setGravity, thì tôi đặt trọng lực như thế nào?
Adam Varhegyi


5
Đăng một tài liệu khổng lồ không phải là giải pháp xin lỗi,
Adam Varhegyi

hãy tìm phương thức setGravity trong liên kết .., bằng cách nào đó, việc chuyển hướng đến phương thức chính xác không hoạt động ..
Yashwanth Kumar

17

Tôi gặp vấn đề tương tự với việc thiết lập layout_gravity theo chương trình trên các nút trong GridLayout.

Mẹo nhỏ là đặt trọng lực lên bố cục nútParams SAU nút được thêm vào cha mẹ (GridLayout), nếu không trọng lực sẽ bị bỏ qua .

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

Làm cách nào để thay đổi layout_gravity cho toàn bộ GridLayout?
Iqbal

15

Nếu bạn muốn thay đổi layou_gravitychế độ xem hiện tại, hãy làm điều này:

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

Hãy nhớ sử dụng quyền LayoutParamsdựa trên loại Bố cục mà chế độ xem của bạn đang ở. Ví dụ:

LinearLayout.LayoutParams

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

sử dụng điều này để thêm mor hơn một trọng lực


9

Câu hỏi này đã cũ nhưng tôi chỉ gặp vấn đề tương tự và giải quyết nó như thế này

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

@Muzikant .. ok .. tôi đã không chú ý đầu tiên .. nhưng bây giờ thì rõ ràng với tôi..Cảm ơn
Noman

Điều này chỉ hoạt động bằng cách chỉ định loại bố trí đầu tiên là gì? Giống như RelativeLayout.LayoutParams ... thay vì chỉ là LayoutParams
ryvianstyron

RelativeLayout.LayoutParams sử dụng các cờ khác để đặt lực hấp dẫn của chế độ xem (rightOf, centreInParent, centre dọc). Cách giải quyết này dành cho trẻ em tuyến tínhLayouts
noni

6

KOTLINE cài đặt nhiều hơn một trọng lực trên FrameLayout mà không thay đổi kích thước:

     // 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()

Đó là tiết kiệm thời gian của tôi ... THX
BertKing

Cảm ơn nhé người anh em! Nó tiết kiệm thời gian của tôi 2 ...
YH_WU

4

Tôi sử dụng đôi khi như thế: (mã Xamarin và C #)

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

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

SetGravity đặt textView của tôi vào giữa bố cục. Vì vậy, thuộc tính bố cục SetGravity đề cập đến nội dung bố cục


4

Trong trường hợp bạn cần đặt Gravity cho Chế độ xem, hãy sử dụng như sau

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

Để đặt layout_gravity cho Nút, hãy sử dụng trường trọng lực cho bố cục như

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

cố gắng hy vọng điều này rõ ràng cảm ơn


3

Phần còn lại của câu trả lời là đúng, tôi muốn thêm giải thích. Bố cục_gravity là về cách định vị khung nhìn trong chế độ xem cha.

Bạn phải đặt trọng lực ** sau khi phương thức ParentView.addView () ** được gọi. Chúng ta có thể thấy mã:

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();
}

Và vấn đề của con trỏ null là vì nó không gọi addView trước getLayoutParams ().

Chú thích đã được nói "Phương thức này có thể trả về null nếu Chế độ xem này không được đính kèm với Viewgroup cha mẹ hoặc {@ link # setLayoutParams (android.view.Viewgroup.LayoutParams)} không được gọi thành công. Viewgroup, phương thức này không được trả về null. "


Tôi cũng vậy, không rõ ràng là bạn phải đặt trọng lực sau khi addView () được gọi. Bạn sẽ nghĩ rằng bạn đã thiết lập mọi thứ trên chế độ xem mới và sau đó thêm nó để điều này không trực quan :-P
kenyee

3

Nếu bạn muốn đặt chế độ xem ở trung tâm của phụ huynh, bạn có thể thực hiện với mã sau đây ..

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);
  }
}

phần mã này làm cho linearLayout đặt các phần tử khung nhìn đầu tiên vào giữa cha. Vì vậy, hệ thống của chúng tôi không xem xét chiều rộng ban đầu và cao để sắp xếp chế độ xem ở trung tâm. Tôi làm phần mã tốt.


i - in nghiêng)))))
Artem

2

đến RelativeLayout, hãy thử mã này, nó hoạt động với tôi: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

Hoàn hảo làm việc !!! Không có câu trả lời trên làm việc cho tôi. Trong tập tin Xml, cài đặt trọng lực và cài đặt layout_gravity là khác nhau. Kiểm tra mã dưới đây

// 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);

Ngoài ra kiểm tra Điều này, nơi bạn có thể tìm thấy lời giải thích rõ ràng về trọng lực và layout_gravity.


1

Hầu hết các câu trả lời trên là đúng, do đó, viết một phương thức trợ giúp, vì vậy bạn có thể sử dụng nó trực tiếp trong dự án của bạn.

thiết layout_gravitylập chương trình

// 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

Tôi đã chuyển từ linearLayout.LayoutParams sang RelativeLayout.LayoutParams để cuối cùng nhận được kết quả mà tôi mong muốn trên một vòng tròn tùy chỉnh mà tôi đã tạo.

Nhưng thay vì trọng lực, bạn sử dụng addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (circleheight, circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

0

Hãy thử mã này

    Button btn = new Button(YourActivity.this);
    btn.setGravity(Gravity.CENTER | Gravity.TOP);
    btn.setText("some text");

hoặc là

    btn.setGravity(Gravity.TOP);

3
OP yêu cầu layout_gravitykhông gravitiy.
Ali Zeynali

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.