프로그래밍 방식으로 사용자 정의보기의 크기를 조정하는 방법은 무엇입니까?


164

RelativeLayout에서 확장 된 사용자 지정보기를 코딩하고 있으며 프로그래밍 방식으로 크기를 조정하고 싶습니다. 어떻게해야합니까?

커스텀 뷰 클래스는 다음과 같습니다.

public ActiveSlideView(Context context, AttributeSet attr){
        super(context, attr);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(inflater != null){       
            inflater.inflate(R.layout.active_slide, this);
        }

답변:


253

뷰의 높이 또는 너비를 통과하지 못하면 Android에서 예외가 발생합니다. 새 LayoutParams 객체를 만드는 대신 다른 모든 설정 매개 변수가 유지되도록 원래 객체를 사용하십시오. getLayoutParams에 의해 반환되는 LayoutParams의 유형 은 크기를 조정하는 뷰가 아니라 부모 레이아웃 의 유형입니다 .

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);

2
@HerbertD가 언급했듯이 LinearLayout.LayoutParams를 사용하지 않으면이 크기를 조정하는 RelativeLayout 조차도이 작업을 수행하는 동안 오류가 발생합니다.
Martin Belcher-AtWrk

6
@Eigo Android 문서에 따르면 LayoutParams는 레이아웃을 담당하는보기이므로 상위보기로 전달됩니다.
sstn

1
입력 값을 dp 값으로 변환해야하는지 또는 작동하는지 여부
Dory

불필요하게 새로운 LayoutParams 객체를 인스턴스화하지
않기 때문에이 방법이 더 좋습니다

129
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

문제 해결됨!

참고 : 부모 레이아웃을 사용하십시오 LayoutParams. 광산은 LinearLayout.LayoutParams!


3
ut 왜 사용하지 않겠습니까RelativeLayout.LayoutParams?
nmr

1
이것은 나를 위해 작동하지 않았다, 나는 그것에 대한 클래스 캐스트 예외가있어.
Tapan Thaker

4
@Tapan Thanker Parent 레이아웃의 LayoutParams를 사용하십시오. 그리고 내 부모 레이아웃은 LinearLayout입니다.
herbertD

10
나는 이것의보다 일반적인 버전을 썼다 : private void resizeView(View view, int newWidth, int newHeight) { try { Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); view.setLayoutParams(ctor.newInstance(newWidth, newHeight)); } catch (Exception e) { e.printStackTrace(); } }
atroutt

2
다른 모든 매개 변수를 기본값으로 재설정합니다. @ smisiewicz 답변이 더 좋습니다.
Fran Marzoa

66

이것은 나를 위해 작동합니다 :

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

7
이 코드는 부모 ViewGroup의 정확한 유형을 알 필요가 없기 때문에 다른 답변보다 훨씬 낫습니다.
Bart Burg

1
requestLayout () 호출과 setLayoutParams (params) 호출의 차이점이 무엇인지 알고 있습니까?
voghDev

2
setLayoutParams (params)에는 requestLayout ()이 포함됩니다.
illusionJJ

44

가치있는 것을 위해 장치 독립적 픽셀 ( dp ) 에서 뷰의 크기를 조정하고 싶다고 가정 해 봅시다 .

픽셀에서 dps로 변환 applyDimension하려면 클래스의 멤버 인 이라는 메서드를 사용해야합니다 TypedValue. 따라서 높이를 150dp (예 :)로 설정하려면 다음과 같이하십시오.

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMetrics());
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) someLayout.getLayoutParams();
params.height = (int) pixels;
someLayout.setLayoutParams(params);

여기서 표현식 : getResources().getDisplayMetrics()화면 밀도 / 해상도를 가져옵니다 .


6
치수를 하드 코딩하는 대신 높이를 픽셀 단위로 사용할 수도 있습니다.float pixels = context.getResources().getDimensionPixelSize(R.dimen.card_height);
Francois Dermu

이 답변은 정답으로 더 적합합니다!. 감사합니다
Yunus Kulyyev 2


6

이것을 시도하십시오 :

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);

답변하신 이후에 모든 질문을 게시하지 못했습니다. 이제 그게 모든 질문입니다. 감사!
herbertD

6

@herbertD의 위의 솔루션의 더 일반적인 버전은 다음과 같습니다.

private void resizeView(View view, int newWidth, int newHeight) { 
    try { 
        Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); 
        view.setLayoutParams(ctor.newInstance(newWidth, newHeight));   
    } catch (Exception e) { 
        e.printStackTrace(); 
    }
}

@atroutt, 당신은 말 그대로 내 하루를 저장 :)
Qasim

5

이 방법을 사용하여 사용자 정의보기의 너비를 늘 렸습니다.

customDrawingView.post(new Runnable() {
                            @Override
                            public void run() {
                                View view_instance = customDrawingView;
                                android.view.ViewGroup.LayoutParams params = view_instance
                                        .getLayoutParams();
                                int newLayoutWidth = customDrawingView
                                        .getWidth()
                                        + customDrawingView.getWidth();
                                params.width = newLayoutWidth;
                                view_instance.setLayoutParams(params);
                                screenWidthBackup = params.width;
                            }
                        });

4

나는 이것을 이런 식으로 해결했다. 기본적으로 xml 파일 안에 간단한 뷰가있다.

 View viewname = findViewById(R.id.prod_extra);
             prodExtra.getLayoutParams().height=64;

2
하하, 매우 순진하지만 잘 작동하는 방법이지만 setLayoutParams ()을 호출하여 중첩 된 가능한 하위 항목으로 변경 사항을 올바르게 전파하는 것이 좋습니다. 항상 형식 증명
comeGetSome

@Bhargav Rao 당신 이이 주제에 나를 도울 수 있습니다 : https://stackoverflow.com/q/44259342/6596724
tux-world

2

당신은 단지이 있다면 two or three condition(sizes)당신은 사용할 수 있습니다 @Overide를 onMeasure 같이

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

그리고 CustomView 클래스에서 이러한 조건의 크기를 쉽게 변경하십시오.


1

재정의 onMeasure하는 경우 새 크기를 업데이트하는 것을 잊지 마십시오

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(newWidth, newHeight);
}

1

이것이 내가 이것을 달성 한 방법입니다. 에서 Sileria의 대답은 그 / 그녀는 다음을했다 :

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

이것은 정확하지만에 높이를 줄 것으로 기대 pixels하지만 dp높이를 원하므로 높이를 추가하고 싶습니다.

public int convertDpToPixelInt(float dp, Context context) {
    return (int) (dp * (((float) context.getResources().getDisplayMetrics().densityDpi) / 160.0f));
}

따라서 다음과 같이 보일 것입니다 :

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = convertDpToPixelInt(50, getContext());
layout.requestLayout();

0

이것이 내가 한 일입니다.

View myView;  
myView.getLayoutParams().height = 32;  
myView.getLayoutParams().width = 32;

이보기가 속한보기 그룹이있는 경우 적용하려면 yourViewGroup.requestLayout ()을 호출해야 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.