프로그래밍 언어/Android

Android에서 여백을 dp로 설정하는 방법

Rateye 2021. 8. 13. 10:17
728x90
반응형

 

질문 : Android에서 프로그래밍 방식으로 여백을 dp로 설정하려면 어떻게해야합니까?

thisthis thread에서 단일 뷰에서 여백을 설정하는 방법에 대한 답변을 찾으려고 노력했습니다. 하지만 더 쉬운 방법이 없는지 궁금합니다. 이 방법을 사용하고 싶지 않은 이유를 설명하겠습니다.

Button을 확장하는 사용자 지정 Button이 있습니다. 배경이 기본 배경이 아닌 다른 것으로 설정되어있는 경우 ( setBackgroundResource(int id) 또는 setBackgroundDrawable(Drawable d) 호출하여) 여백을 0으로 설정하고 싶습니다. 이것을 호출하면 :

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

나는 여백 (나는 이미 읽은 -3dp을 재설정하려면 여기 내가 픽셀의 세트 마진, 나는 전환이 자신을 관리 할 수있는 방법을 알고 그래서 일단, DP에 픽셀로 변환하는 방법). CustomButton 클래스에서 호출되기 때문에 부모는 LinearLayout에서 TableLayout까지 다양 할 수 있으며 오히려 부모를 가져 와서 해당 부모의 인스턴스를 확인하도록하고 싶지 않습니다. 그것은 또한 상당히 성능이 떨어질 것이라고 생각합니다.

또한 호출 할 때 (LayoutParams 사용) parentLayout.addView(myCustomButton, newParams) , 이것이 올바른 위치에 추가되는지 (하지만 시도하지 않았 음), 5 행의 중간 버튼을 말하면 알 수 없습니다.

질문 : LayoutParams를 사용하는 것 외에 프로그래밍 방식으로 단일 버튼의 여백을 설정하는 더 쉬운 방법이 있습니까?

편집 : LayoutParams 방식을 알고 있지만 각기 다른 컨테이너 유형을 처리하지 않는 솔루션을 원합니다.

ViewGroup.LayoutParams p = this.getLayoutParams();
    if (p instanceof LinearLayout.LayoutParams) {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof RelativeLayout.LayoutParams) {
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof TableRow.LayoutParams) {
        TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
}

this.getLayoutParams(); topMargin , bottomMargin , leftMargin , rightMargin 속성이없는 ViewGroup.LayoutParams 반환합니다. mc 인스턴스는 오프셋 (-3dp) 여백과 (oml, omr, omt, omb) 및 원래 여백 (ml, mr, mt, mb)을 포함 MarginContainer

답변

버튼 여백을 설정하려면 LayoutParams

LayoutParams params = new LayoutParams(
        LayoutParams.WRAP_CONTENT,      
        LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);

사용중인 레이아웃에 따라 RelativeLayout.LayoutParams 또는 LinearLayout.LayoutParams 를 사용해야합니다.

그리고 dp 측정 값을 픽셀로 변환하려면 다음을 시도하십시오.

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        yourdpmeasure, 
        r.getDisplayMetrics()
);
출처 : https://stackoverflow.com/questions/12728255/in-android-how-do-i-set-margins-in-dp-programmatically
728x90
반응형