에서 이 , 이 및 이 스레드가 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)을 포함하는 것입니다.
답변
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()
);
답변
LayoutParams-작동하지 않습니다! ! !
사용 유형 필요 : MarginLayoutParams
MarginLayoutParams params = (MarginLayoutParams) vector8.getLayoutParams();
params.width = 200; params.leftMargin = 100; params.topMargin = 200;
MarginLayoutParams의 코드 예 :
http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams
답변
가장 좋은 방법 :
private void setMargins (View view, int left, int top, int right, int bottom) {
if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
p.setMargins(left, top, right, bottom);
view.requestLayout();
}
}
메소드 호출 방법 :
setMargins(mImageView, 50, 50, 50, 50);
이것이 도움이되기를 바랍니다.
답변
int sizeInDP = 16;
int marginInDp = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, sizeInDP, getResources()
.getDisplayMetrics());
그때
layoutParams = myView.getLayoutParams()
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);
또는
LayoutParams layoutParams = new LayoutParams...
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);
답변
최근 업데이트 된 올인원 답변입니다.
1 단계, 여백 업데이트
기본 아이디어는 여백을 얻은 다음 업데이트하는 것입니다. 업데이트가 자동으로 적용되므로 다시 설정할 필요가 없습니다. 레이아웃 매개 변수를 얻으려면이 메소드를 호출하십시오.
LayoutParams layoutParams = (LayoutParams) yourView.findViewById(R.id.THE_ID).getLayoutParams();
은 LayoutParams
보기의 레이아웃에서 온다. 뷰가 선형 레이아웃에서 가져온 경우을 가져와야 LinearLayout.LayoutParams
합니다. 상대 레이아웃을 사용하는 경우 import LinearLayout.LayoutParams
등
다음을 사용하여 여백을 설정하면 이제 Layout_marginLeft
, Right
등,이 방법으로 업데이트 여유 필요
layoutParams.setMargins(left, top, right, bottom);
new를 사용하여 여백을 설정하면 다음과 같이 여백 layout_marginStart
을 업데이트해야합니다.
layoutParams.setMarginStart(start);
layoutParams.setMarginEnd(end);
2 단계, dp의 여백 업데이트
위의 여백을 업데이트하는 두 가지 방법은 모두 픽셀 단위로 업데이트하는 것입니다. dp를 픽셀로 변환해야합니다.
float dpRatio = context.getResources().getDisplayMetrics().density;
int pixelForDp = (int)dpValue * dpRatio;
이제 계산 된 값을 위의 여백 업데이트 기능에 넣으십시오.
답변
layout_margin은 뷰 자식이 부모에게 알려주는 제약 조건입니다. 그러나 마진을 허용할지 여부를 선택하는 것이 부모의 역할입니다. 기본적으로 android : layout_margin = “10dp”를 설정하여 자식은 부모보기 그룹 이 실제 크기보다 10dp 큰 공간을 할당하도록 탄원합니다 . (padding = “10dp”는 반면에 자식 뷰가 자체 컨텐츠를 10dp 작게 만듭니다.)
결과적으로 모든 ViewGroup이 margin을 존중하는 것은 아닙니다 . 가장 악명 높은 예는 항목의 여백이 무시되는 listview입니다. setMargin()
LayoutParam 을 호출하기 전에 항상 현재 뷰가 여백을 지원하는 ViewGroup (예 : LinearLayouot 또는 RelativeLayout)에 getLayoutParams()
있는지 확인하고 원하는 특정 LayoutParams로 결과를 캐스트 해야합니다. ( 방법 ViewGroup.LayoutParams
조차 없습니다 setMargins()
!)
아래 함수는 트릭을 수행해야합니다. 그러나 RelativeLayout을 상위 뷰 유형으로 대체해야합니다.
private void setMargin(int marginInPx) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams();
lp.setMargins(marginInPx,marginInPx, marginInPx, marginInPx);
setLayoutParams(lp);
}
답변
이 방법 으로 DP 의 여백 을 설정할 수 있습니다
public void setMargin(Context con,ViewGroup.LayoutParams params,int dp) {
final float scale = con.getResources().getDisplayMetrics().density;
// convert the DP into pixel
int pixel = (int)(dp * scale + 0.5f);
ViewGroup.MarginLayoutParams s =(ViewGroup.MarginLayoutParams)params;
s.setMargins(pixel,pixel,pixel,pixel);
yourView.setLayoutParams(params);
}
최신 정보
필요에 따라 매개 변수를 변경할 수 있습니다.