코드에서 layout_weight 속성을 동적으로 설정하는 방법은 무엇입니까?


245

layout_weightjava 코드에서 android의 버튼 속성 값을 동적으로 어떻게 설정할 수 있습니까?


이 질문 / 답변과 매우 유사합니다 : stackoverflow.com/questions/4638832/… 그리고 이것 : stackoverflow.com/questions/4637233/…
Rich Schuler

layout (xml) 파일에서 이미보기를 정의한 경우 새 LayoutParams를 작성하면 xml 파일에 정의 된 다른 매개 변수를 겹쳐 씁니다. 먼저 "getLayoutParams"를 사용해야합니다. 전체 답변보기 stackoverflow.com/questions/4641072/…
Shirish Herwade 2016 년

답변:


463

LinearLayout.LayoutParams생성자의 일부로 전달할 수 있습니다 .

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

마지막 매개 변수는 무게입니다.


2
그것은해야한다param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan

49
더블에서 플로트로 캐스팅하고 싶지 않다면 1.0f를 넣으십시오.
Xample

8
1f소수점 이하 자리가없는 경우 더 간단 합니다
sandalone

4
부모 레이아웃 인 경우해야 할 일Relative
Pratik Butani

9
@pratik 부모 레이아웃이 상대적이라면 가중치를 사용하지 않습니다
invertigo

121

사용 LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);

편집 : 아, Erich의 대답이 더 쉽습니다!


27
Erich의 anser는 쓰기가 쉽지만, 읽기는 쉽습니다. 1.0f가 사용되는 속성을 나타냅니다.
Johan

3
당신은 'view.getLayoutParams ()'를 호출하여 즉시 무게를 수정할 수 있다는 것을 확립했습니다.
RobGThai

1
FILL_PARENT더 이상 사용되지 않으며 MATCH_PARENT대신 사용해야합니다.
Simon Forsberg

2
@LocalPCGuy 사실이 아닙니다. 만큼 당신이하고 같은 목표 SDK> = 8 (당신이 절대적으로 있어야하는) MATCH_PARENT대신 사용할 수 있습니다 FILL_PARENT심지어 오래된 장치.
Kevin Coppock

2
@LocalPCGuy 더 이상 API 7 이하를 사용하는 사람은 없습니다 . 앱이 API 7 이하와 호환되도록하려면 FILL_PARENTvs에 대해 걱정하기 전에 다른 많은 문제가 발생할 수 MATCH_PARENT있습니다.
Simon Forsberg

82

layout (xml) 파일에서 이미 뷰를 정의한 경우 프로그래밍 방식으로 가중치 만 변경하려는 경우이 방법이 더 좋습니다.

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

새로운 LayoutParams는 여백과 같이 XML 파일에 정의 된 다른 매개 변수를 덮어 쓰거나 LayoutParams에서 모든 매개 변수를 지정해야합니다.


2
"params.weight = 1f;" 이미 LayoutParams 객체에 가중치를 설정하고 있습니다. "mButton.setLayoutParams (params);"를 호출 할 필요가 없습니다.
MrMaffen

2
아니요, setLayoutParams
SIr Codealot에 문의해야합니다.

1
이것은 실제로 가장 우아한 답변이며 특정 UI 객체를 직접 변경합니다. 가장 좋은 답변은이 게시물보다 좋고 오래되었습니다. 따라서 최선의 대답으로 자격이 있습니다. 그래도이 게시물을 올렸습니다.
오리지널 안드로이드

위대하고 간단한 해결책!
Jeremy

매력처럼 작동합니다! 고마워 :)
Vinay Vissh

26

너비, 높이 및 무게가있는 생성자가 작동하지 않으면 너비와 높이가있는 생성자를 사용하십시오. 그런 다음 수동으로 무게를 설정하십시오.

가중치에 따라 너비를 설정하려면 생성자에서 너비를 0으로 설정하십시오. 높이도 마찬가지입니다. 아래 코드는 저에게 효과적입니다.

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);

parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);

내가 필요한 것! 모두가 여기에 무게 설정에 대해 이야기하고 있지만, 무게가 측정 된 어린이가 부모보기에 추가 될 때 어떤 일이 발생했는지는 아무도 표시하지 않았습니다! 실제로 ParentView에 weightSum을 추가하는 방법을 찾고있었습니다! 감사!
sud007

14

누군가 답을 찾고 있다면 이것을 사용하십시오.

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

xml 파일에서 레이아웃을 초기화하는 경우 선형 레이아웃에 새 레이아웃 매개 변수를 제공하는 것보다 훨씬 편리합니다.


너비 / 높이 / 여백 / 패딩 등과 같이 이전에 설정 한 변수를 수정하지 않으므로 허용되는 대답이어야합니다. 무게가 변경되는 동안 모든 것이 유지되고 재사용됩니다.
MrMaffen

1
설정할보기 layout_weight가 이미 배치 된 경우 View.requestLayout()업데이트 를 위해 전화해야합니다 .
공격적인

6

의 모든 LinearLayout.LayoutParams과가 TableLayout.LayoutParams바로 하나가 버튼에, 날 위해 일했습니다 TableRow.LayoutParams. 그건:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

사용 MATCH_PARENT하거나 WRAP_CONTENT동일합니다.


3
FILL_PARENT더 이상 사용되지 않으며 MATCH_PARENT대신 사용해야합니다.
Simon Forsberg

LayoutParams.MATCH_PARENT를 0으로 변경해야한다고 생각합니다.
CoolMind

당신 LayoutParams은 직접 부모의 전화 . LinearLayout.LayoutParams부모님없이 충돌을 시도했다고 가정합니다 LinearLayout.
버려진 장바구니

4

이 경우 이미 레이아웃 (XML) 파일에보기를 정의 만 무게를 변경하려면 다음 다음 XML 파일에 정의 된 새의 LayoutParams 덮어 쓰기 다른 PARAMS를 작성, 문법적으로 프로.

먼저 "getLayoutParams"를 사용한 다음 setLayoutParams를 사용해야합니다.

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);


3

layoutparamsXML로 또는 동적으로 이미 정의 된 경우 하나의 라이너가 있습니다.

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

과소 평가
Adam Higgins

0

Kotlin을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*

import android.widget.LinearLayout

class RespondTo : CardView {
    constructor(context: Context) : super(context) {
        init(context)
    }

    private fun init(context: Context) {


        val parent = LinearLayout(context)

        parent.apply {
            layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply {
                orientation = LinearLayout.HORIZONTAL

                addView(EditText(context).apply {
                    id = generateViewId()
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply {
                    }
                })
                addView(ImageButton(context).apply({
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
                    background = null
                    setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
                    id = generateViewId()
                    layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT).apply {
                        addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
                        // addRule(RelativeLayout.LEFT_OF, myImageButton.id)
                    }
                }))
            }
        }
        this.addView(parent)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.