프로그래밍 방식으로 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)입니다. 는 gravitybutton.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.