프로그래밍 방식으로 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);

어떤 해결책?


null이 아닌 LayoutParam을 갖기 전에 부모에보기를 추가해야한다고 생각합니다.
— Rich 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);

코 틀린

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 (단, Docs의 BOTTOM이어야 함)이 작동하지 않습니다. 보기와 텍스트 아래에 공간이 있습니다. 그것의 하단 정렬 ...
— 아담 Varhegyi

51
문서에서 일정한 가치를 얻는 것은 단순히 잘못입니다. Gravity.TOP
— Maragues

35
이것은 "gravity"이고 그는 "layout_gravity"를 요청했습니다 ??
— M. Usman Khan

10
@ usman 아니오, 이것은 약 layout_gravity(즉 LayoutParams.gravity)입니다. 는 gravity것button.setGravity()
— Floern

8
SO에 중력과 layout_gravity에 관한 많은 잘못된 정보가 있습니다. 많은 ppl setGravity()은 이것이 layout_gravity 라고 생각 하지만 이것이 잘못되었습니다. 이 대답은 프로그래밍 방식으로 layout_gravity를 설정하는 것이 정확하다는 것을 승인 할 수 있습니다.
— Bevor

55

나는 오래된 스레드를 부활시키는 것을 싫어하지만 이것은 올바르게 대답하지 않은 문제이며 더 나아가이 문제에 직접 직면했습니다.

답변이 마음에 들면 코드까지 아래로 스크롤하십시오.

android : gravity와 android : layout_gravity는 다르게 작동합니다. 여기 내가 읽은 기사가 도움이되었습니다.

기사의 GIST : 높이 / 너비가 할당 된 후 중력이 뷰에 영향을줍니다. 따라서 중력 중심은 FILL_PARENT (자동 여백으로 생각)를 수행 한 뷰에 영향을 미치지 않습니다. layout_gravity center는 FILL_PARENT 인 뷰에 영향을 미칩니다 (자동 패드라고 생각).

기본적으로 android : layout_gravity는 프로그래밍 방식으로 액세스 할 수 없으며 android : gravity 만 가능합니다. 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
layout_gravity가 아니라 중력입니다.
— Adam Varhegyi

그런 다음 layout_gravity가 setGravity와 같은지 알려면 중력을 어떻게 설정합니까?
— Adam Varhegyi


5
거대한 문서를 게시하는 것은 죄송합니다.
— Adam Varhegyi

링크에서 setGravity 방법에 대한 모습은 .. 정확한 방법으로 어떻게 든 리디렉션이 작동하지 않습니다 ..
— Yashwanth 쿠마

17

GridLayout의 버튼에 프로그래밍 방식으로 layout_gravity를 설정하는 것과 비슷한 문제가있었습니다.

트릭은 버튼의 LayoutParams에 세트 중력했다 후에 , 버튼이 부모 (GridLayout과)에 추가 된 그렇지 않으면 중력이 무시 될 것이다 .

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

전체 GridLayout의 layout_gravity를 어떻게 변경합니까?
— Iqbal

15

layou_gravity기존보기 를 변경하려면 다음 을 수행하십시오.

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

LayoutParams보기가있는 레이아웃 유형에 따라 올바른 것을 사용해야합니다 . 예 :

LinearLayout.LayoutParams


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의 어린이입니다
— 노니

6

크기를 변경하지 않고 FrameLayout에서 둘 이상의 중력을 설정하는 KOTLIN :

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

나는 그런 것을 사용합니다 : (Xamarin 및 C # 코드)

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

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

SetGravity는 레이아웃의 중앙에 textView를 넣습니다. 따라서 SetGravity 레이아웃 속성은 레이아웃 내용을 나타냅니다


4

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

그리고 null 포인터의 문제는 getLayoutParams () 전에 addView를 호출하지 않기 때문입니다.

주석은 이미 "이 뷰가 상위 뷰 그룹에 연결되지 않았거나 {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)}가 성공적으로 호출되지 않은 경우이 메소드는 널을 리턴 할 수 있습니다. 뷰가 상위에 첨부 된 경우 ViewGroup,이 메소드는 널을 리턴하지 않아야합니다. "


이 비트도 ... addView ()가 호출 된 후 중력을 설정해야한다는 것은 분명하지 않습니다. 당신은 당신이 새로운 관점에서 모든 것을 설정 한 다음 그것을 직관적이지 않도록 추가 할 것이라고 생각할 것입니다 :
— -P

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

RelativeLayout 에이 코드를 시도하면 나를 위해 작동합니다. yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


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로 전환하여 내가 만든 사용자 정의 circleview에서 원하는 결과를 얻었습니다.

그러나 중력 대신 addRule을 사용합니다.

RelativeLayout.LayoutParams mCircleParams = 새로운 RelativeLayout.LayoutParams (원 높이, 원 높이);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

0

이 코드를 사용해보십시오

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

또는

    btn.setGravity(Gravity.TOP);

3
OP는 요청 layout_gravity하지 않습니다 gravitiy.
— 알리 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.