프로그래밍 방식으로 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
'development' 카테고리의 다른 글
C에서 MIN과 MAX (0) | 2020.03.31 |
---|---|
LIKE 와일드 카드를 사용하여 열에서 어떻게 대소 문자를 구분하지 않고 검색 할 수 있습니까? (0) | 2020.03.31 |
RStudio를 사용하여 R 업데이트 (0) | 2020.03.31 |
안드로이드 조각 및 애니메이션 (0) | 2020.03.31 |
PyCharm은 유효한 코드에 대한 해결되지 않은 참조 오류를 표시합니다 (0) | 2020.03.31 |