코드에서 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.