development

프로그래밍 방식으로 LinearLayout에서 여백 설정

big-blog 2020. 3. 31. 08:21
반응형

프로그래밍 방식으로 LinearLayout에서 여백 설정


화면을 채우고 여백이있는 버튼으로 LinearLayout을 만들기 위해 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.MarginLayoutParams를 사용해 보았지만 가중치 멤버가 없으므로 좋지 않습니다.

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() );

... 이것은 주변 레이아웃을 알거나 편집 할 필요없이 작동합니다. 여백을 지원하지 않는 무언가에 대해 이것을 시도하고 실행하는 경우 "instanceof"검사에 유의하십시오.


장치 화면 픽셀 밀도의 변화로 인해 항상 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그렇지 않으면 오류가 발생합니다.


이 시도

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

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

이 시도:

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);
}

위 코드에서 예를 들어 frameLayout의 여백을 변경하고 frameLayout의 뷰 그룹이 RelativeLayout 이므로 (RelativeLayout.LayoutParams) 을 은닉해야합니다.


여기에 한 줄 해결책 :

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

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

반응형