에서 이 , 이 및 이 스레드가 I 단일 뷰에 여백을 설정하는 방법에 대한 답을 찾기 위해 노력했다. 그러나 더 쉬운 방법이 없는지 궁금했습니다. 왜이 접근법을 사용하고 싶지 않은지 설명하겠습니다.
버튼을 확장하는 사용자 정의 버튼이 있습니다. 배경이 기본 배경이 아닌 다른 것으로 설정되면 ( 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를 사용하는 것 외에 프로그래밍 방식으로 단일 Button의 여백을 설정하는 더 쉬운 방법이 있습니까?
편집 : 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();
리턴한다 ViewGroup.LayoutParams
속성이없는, topMargin
, bottomMargin
, leftMargin
, rightMargin
. 표시되는 mc 인스턴스 MarginContainer
는 오프셋 (-3dp) 여백과 (oml, omr, omt, omb) 및 원래 여백 (ml, mr, mt, mb)을 포함하는 것입니다.