질문 : Android에서 프로그래밍 방식으로 여백을 dp로 설정하려면 어떻게해야합니까?
this 및 this 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
'프로그래밍 언어 > Android' 카테고리의 다른 글
Android XML 그리기 가능 파일에서 원 모양을 정의하는 방법 (0) | 2021.08.20 |
---|---|
Android에서 가로 모드를 비활성화하는 방법 (0) | 2021.08.13 |
Android Studio 최소 SDK 버전 API 변경 (0) | 2021.08.13 |
오류 : The application may be doing too much work on its main thread (0) | 2021.08.11 |
Android 6.0 Marshmallow (API 23)에서 getColor (int id) 지원 중단됨 (0) | 2021.08.10 |