it-source

프로그래밍 방식으로 사용자 정의 보기 크기를 조정하는 방법

criticalcode 2023. 8. 4. 23:08
반응형

프로그래밍 방식으로 사용자 정의 보기 크기를 조정하는 방법

상대 레이아웃에서 확장된 사용자 정의 보기를 코딩하고 프로그래밍 방식으로 크기를 조정하려고 합니다. 어떻게 해야 합니까?

사용자 정의 뷰 클래스는 다음과 같습니다.

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);
        }

Android는 보기의 높이나 너비를 통과하지 못할 경우 예외를 던집니다.새 LayoutParams 객체를 만드는 대신 원래 객체를 사용하여 다른 모든 세트 매개변수를 유지합니다.getLayoutParams에서 반환되는 LayoutParams 유형은 크기를 조정하는 뷰가 아니라 상위 레이아웃 유형입니다.

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

문제가 해결되었습니다!

참고: 부모 레이아웃을 사용해야 합니다.LayoutParams내꺼는LinearLayout.LayoutParams!

이것은 나에게 도움이 됩니다.

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

Kotlin에서는 ktx 확장자를 사용할 수 있습니다.

yourView.updateLayoutParams {
   height = <YOUR_HEIGHT>
}

장치 독립 픽셀(dp)에서 보기 크기를 조정하려고 했다고 가정해 보겠습니다.

다음과 같은 방법을 사용해야 합니다.applyDimension그것은 학급의 일원입니다.TypedValuedp에서 픽셀로 변환합니다.따라서 높이를 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()화면 밀도/해상도를 가져옵니다.

다음은 @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(); 
    }
}

이것을 사용해 보십시오.

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

사용자 정의 보기의 너비를 늘리기 위해 이 방법을 사용했습니다.

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;
                            }
                        });

Kotlin을 사용하고 dp 단위를 사용하는 경우:

myView.updateLayoutParams {
    val pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200f, context.resources.displayMetrics)
    height = pixels.toInt()
}

저는 이런 식으로 해결했습니다.기본적으로 xml 파일 내부에 간단한 뷰가 있습니다.

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

당신이 가지고 있는 것이 오직two or three condition(sizes)그런 다음 @Overide를 사용할 수 있습니다. onMeasure맘에 들다

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

또한 CustomView 클래스에서 이러한 조건에 맞는 크기를 쉽게 변경할 수 있습니다.

코틀린에서 수행할 수 있는 방법은 다음과 같습니다.

레이아웃 매개 변수 업데이트:

val view = layoutInflater.inflate(R.layout.cell, binding.ssss, false).apply {
            id = View.generateViewId()

            updateLayoutParams { 
                height = 200
                width = 400 
            }

        }
binding.ssss.addView(view)

OR

레이아웃파라미터:

val view = layoutInflater.inflate(R.layout.cell, binding.ssss, false).apply {
            id = View.generateViewId()
            
            layoutParams.width = 200
            layoutParams.height = 200
            
        }
binding.ssss.addView(view)

만약 당신이 무시한다면onMeasure새 사이즈 업데이트하는 것을 잊지 마세요.

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

이것이 제가 이것을 성취한 방법입니다.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();

제가 한 일은 이렇습니다.

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

이 뷰가 속한 뷰 그룹이 있는 경우 ViewGroup.requestLayout()을 호출하여 적용해야 할 수도 있습니다.

fun View.setSize(width: Int, height: Int) {
    updateLayoutParams {
        this.width = width
        this.height = height
    }
}

언급URL : https://stackoverflow.com/questions/2963152/how-to-resize-a-custom-view-programmatically

반응형