태그 보관물: layout

layout

안드로이드에서 프로그래밍 방식으로 dp의 여백을 어떻게 설정합니까? 성능이 떨어질

에서 , 스레드가 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);
}

최신 정보

필요에 따라 매개 변수를 변경할 수 있습니다.