선형 레이아웃에서 여백을 프로그래밍 방식으로 설정
화면을 채우고 여백이 있는 버튼으로 선형 레이아웃을 만들기 위해 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
'programing' 카테고리의 다른 글
페이스북에서 반환된 X-FB-DEBUG 헤더는 무엇입니까? (0) | 2023.08.05 |
---|---|
오류: xxx 테이블에 대한 테이블스페이스가 있습니다.가져오기 전에 테이블스페이스를 삭제하십시오. (0) | 2023.08.05 |
SQL 그룹 기준 - 월별 레코드 수, 삽입 시 오류 - 유효한 달이 아님 (0) | 2023.07.31 |
Xcode 4: 콘솔을 어떻게 보십니까? (0) | 2023.07.31 |
도커 파일의 조건부 복사/추가? (0) | 2023.07.31 |