programing

선형 레이아웃에서 여백을 프로그래밍 방식으로 설정

starjava 2023. 8. 5. 09:43
반응형

선형 레이아웃에서 여백을 프로그래밍 방식으로 설정

화면을 채우고 여백이 있는 버튼으로 선형 레이아웃을 만들기 위해 XML이 아닌 Java를 사용하려고 합니다.마진 없이 작동하는 코드는 다음과 같습니다.

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

그래서 그것은 잘 작동하지만, 도대체 어떻게 버튼 사이에 공간이 있도록 여백을 줄 수 있습니까?사용해 보았습니다.LinearLayout.MarginLayoutParams하지만 그것은 없습니다.weight멤버라서 안 돼요.그리고 당신이 그것을 통과하면 작동하지 않습니다.lp생성자에서도 마찬가지입니다.

이것은 불가능합니까?보기에도 그럴듯하고, XML로만 할 수 있는 첫 번째 안드로이드 레이아웃 작업은 아닐 것이기 때문입니다.

다음은 이를 위한 작은 코드입니다.

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(30, 20, 30, 0);

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);

그래서 그것은 잘 작동하지만, 도대체 어떻게 버튼 사이에 공간이 있도록 여백을 줄 수 있습니까?

호출setMargins()에서LinearLayout.LayoutParams물건.

선형 레이아웃을 사용해 보았습니다.마진레이아웃 파라미터입니다만, 웨이트 멤버가 없어서 좋지 않습니다.

LinearLayout.LayoutParams의 하위 클래스입니다.LinearLayout.MarginLayoutParams문서에 표시된 바와 같이.

이것은 불가능합니까?

아니요.

XML에서만 할 수 있는 첫 번째 안드로이드 레이아웃 작업은 아닐 것입니다.

당신은 이 청구에 대한 증거를 제공하는 것을 환영합니다.

개인적으로, 저는 SDK의 Java 메서드가 아닌 XML을 통해서만 수행할 수 있는 것에 대해 알지 못합니다.사실 XML은 실행 가능한 코드가 아니기 때문에 정의에 따라 모든 작업을 Java를 통해 수행할 수 있어야 합니다(SDK 접근 가능한 방법을 사용할 필요는 없지만).하지만, 만약 당신이 무언가를 알고 있다면, 그것을 지적하세요, 왜냐하면 그것은 언젠가 고쳐질 SDK의 버그이기 때문입니다.

항목에 직접 여백을 추가하려면(일부 항목에서는 여백을 직접 편집할 수 있음) 다음 작업을 수행할 수 있습니다.

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

...이 기능은 주변 레이아웃을 알거나 편집할 필요가 없습니다.마진을 지원하지 않는 항목에 대해 이 항목을 실행하려는 경우 "instance of"(인스턴스 오브) 검사를 참고하십시오.

장치 화면 픽셀 밀도의 변화로 인해 항상 사용하기 좋습니다.DIP단위는 마진을 프로그래밍 방식으로 설정합니다.아래와 같이_

//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());

//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));

//set margin...
yourLayoutTOsetMargin.setLayoutParams(params); 

이것이 도움이 되기를 바랍니다.

아래 코드를 사용하여 직접 마진을 설정했습니다.

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params);

여기서 주목해야 할 것은LayoutParams다음 패키지에 대해 가져와야 합니다.android.widget.RelativeLayout.LayoutParams그렇지 않으면 오류가 발생합니다.

 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);

사용해 보세요.

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

사용해 보십시오.

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

뷰의 viewGroup 유형을 알고 있어야 합니다.예를 들어 위의 코드에서 프레임 레이아웃의 여백을 변경하고 프레임 레이아웃의 뷰 그룹이 상대 레이아웃이므로 (상대 레이아웃)으로 숨깁니다.레이아웃 매개변수)

단일 라인 솔루션:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));

코어-KTX:

 updateLayoutParams<RecyclerView.LayoutParams> {
                topMargin = 10
                rightMargin = 10
                bottomMargin = 10
                leftMargin = resources.getDimensionPixelSize(R.dimen.left)
            }

RecycleView(재활용 보기) 대신 ViewGroup(보기 그룹)에 있는 모든 보기를 사용합니다.

언급URL : https://stackoverflow.com/questions/2481455/set-margins-in-a-linearlayout-programmatically

반응형