뷰의 오른쪽 여백을 프로그래밍 방식으로 변경하시겠습니까?
자바 코드에서 이 속성을 동적으로 변경할 수 있습니까?
android:layout_marginRight
저는.TextView
, 그것은 왼쪽으로 픽셀들의 위치를 동적으로 변경해야 합니다.
어떻게 프로그래밍을 하나요?
EDIT: 레이아웃 유형에 의존하지 않는 보다 일반적인 방법(마진을 지원하는 레이아웃 유형 이외):
public static void setMargins (View v, int l, int t, int r, int b) {
if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(l, t, r, b);
v.requestLayout();
}
}
TextView에 대한 문서를 확인해야 합니다.기본적으로 TextView의 LayoutParams 개체를 가져와 여백을 수정한 다음 TextView로 다시 설정합니다.선형 레이아웃에 있다고 가정하고 다음과 같은 방법을 사용해 보십시오.
TextView tv = (TextView)findViewById(R.id.my_text_view);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 0, 10, 0); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);
지금 당장은 테스트를 할 수가 없어서 캐스팅이 조금 안 될 수도 있지만, 마진을 바꾸려면 LayoutParams를 수정해야 합니다.
메모
텍스트 뷰가 상대 레이아웃과 같이 내부에 있는 경우 상대 레이아웃을 사용해야 합니다.선형 레이아웃 대신 LayoutParams.배치 매개변수
업데이트 : 안드로이드 KTX
코어 KTX 모듈은 안드로이드 프레임워크의 일부인 공통 라이브러리를 위한 확장 기능을 제공합니다.
dependencies {
implementation "androidx.core:core-ktx:{latest-version}"
}
다음 확장 기능은 여백 처리에 편리합니다.
참고: 모두 확장 기능입니다.
MarginLayoutParams
, 그래서 우선 당신은 그들을 구하고 캐스팅해야 합니다.layoutParams
귀하의 의견:val params = (myView.layoutParams as ViewGroup.MarginLayoutParams)
setMargins()
확장 함수:
의 모든 축의 여백을 설정합니다.ViewGroup
의MarginLayoutParams
. (차원은 픽셀 단위로 제공되어야 합니다. dp로 작업하려면 마지막 섹션을 참조하십시오.)
inline fun MarginLayoutParams.setMargins(@Px size: Int): Unit
// E.g. 16px margins
params.setMargins(16)
updateMargins()
확장 함수:
의 여백을 업데이트합니다.ViewGroup
의ViewGroup.MarginLayoutParams
.
inline fun MarginLayoutParams.updateMargins(
@Px left: Int = leftMargin,
@Px top: Int = topMargin,
@Px right: Int = rightMargin,
@Px bottom: Int = bottomMargin
): Unit
// Example: 8px left margin
params.updateMargins(left = 8)
updateMarginsRelative()
확장 함수:
의 상대 마진을 업데이트합니다.ViewGroup
의MarginLayoutParams
(왼쪽/오른쪽 대신 시작/끝).
inline fun MarginLayoutParams.updateMarginsRelative(
@Px start: Int = marginStart,
@Px top: Int = topMargin,
@Px end: Int = marginEnd,
@Px bottom: Int = bottomMargin
): Unit
// E.g: 8px start margin
params.updateMargins(start = 8)
다음 확장 속성을 사용하면 현재 여백을 얻을 수 있습니다.
inline val View.marginBottom: Int
inline val View.marginEnd: Int
inline val View.marginLeft: Int
inline val View.marginRight: Int
inline val View.marginStart: Int
inline val View.marginTop: Int
// E.g: get margin bottom
val bottomPx = myView1.marginBottom
- 사용.
dp
대신에px
:
같이 작업하고 싶으시면dp
(밀도에 무관한 픽셀)px
, 먼저 변환해야 합니다.다음 확장 속성을 사용하면 쉽게 이 작업을 수행할 수 있습니다.
val Int.px: Int
get() = (this * Resources.getSystem().displayMetrics.density).toInt()
그러면 이전 확장 기능을 다음과 같이 호출할 수 있습니다.
params.updateMargins(start = 16.px, end = 16.px, top = 8.px, bottom = 8.px)
val bottomDp = myView1.marginBottom.dp
이전 답변:
코틀린에서는 다음과 같은 확장 기능을 선언할 수 있습니다.
fun View.setMargins(
leftMarginDp: Int? = null,
topMarginDp: Int? = null,
rightMarginDp: Int? = null,
bottomMarginDp: Int? = null
) {
if (layoutParams is ViewGroup.MarginLayoutParams) {
val params = layoutParams as ViewGroup.MarginLayoutParams
leftMarginDp?.run { params.leftMargin = this.dpToPx(context) }
topMarginDp?.run { params.topMargin = this.dpToPx(context) }
rightMarginDp?.run { params.rightMargin = this.dpToPx(context) }
bottomMarginDp?.run { params.bottomMargin = this.dpToPx(context) }
requestLayout()
}
}
fun Int.dpToPx(context: Context): Int {
val metrics = context.resources.displayMetrics
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics).toInt()
}
그러면 이렇게 부를 수 있습니다.
myView1.setMargins(8, 16, 34, 42)
또는:
myView2.setMargins(topMarginDp = 8)
LayoutParams(배치 매개변수)를 사용합니다.그러나 어떤 레이아웃 파라미터를 선택할지 주의해야 합니다.https://stackoverflow.com/a/11971553/3184778 에 따르면 "실제 뷰가 아니라 작업 중인 뷰의 부모와 관련된 뷰를 사용해야 합니다."
예를 들어 텍스트 보기가 테이블 행 내부에 있는 경우 테이블 행을 사용해야 합니다.상대 레이아웃 또는 선형 레이아웃 대신 레이아웃 매개변수
이 함수를 사용하여 모든 여백 유형을 설정합니다.
public void setViewMargins(Context con, ViewGroup.LayoutParams params,
int left, int top , int right, int bottom, View view) {
final float scale = con.getResources().getDisplayMetrics().density;
// convert the DP into pixel
int pixel_left = (int) (left * scale + 0.5f);
int pixel_top = (int) (top * scale + 0.5f);
int pixel_right = (int) (right * scale + 0.5f);
int pixel_bottom = (int) (bottom * scale + 0.5f);
ViewGroup.MarginLayoutParams s = (ViewGroup.MarginLayoutParams) params;
s.setMargins(pixel_left, pixel_top, pixel_right, pixel_bottom);
view.setLayoutParams(params);
}
언급URL : https://stackoverflow.com/questions/4472429/change-the-right-margin-of-a-view-programmatically
'programing' 카테고리의 다른 글
iOS 이미지 방향에 이상한 동작이 있음 (0) | 2023.09.06 |
---|---|
MySQL/MariaDB GET_LOCK 라이프사이클 with Events (0) | 2023.09.06 |
자바스크립트 strcmp()가 있습니까? (0) | 2023.09.06 |
Administrator(관리자)로 로그인한 경우에도 파일을(를) (0) | 2023.09.06 |
Vue.js에서 /deep/ 또는 >> 또는 ::v-deep을 어떻게 사용합니까? (0) | 2023.09.06 |