프로그래밍 방식으로 뷰에 패딩 추가
저는 안드로이드 v2.2 앱을 개발하고 있습니다.
나는 있습니다Fragment
.에서onCreateView(...)
fragment 클래스의 콜백, 아래와 같이 fragment로 레이아웃을 확장합니다.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.login, null);
return view;
}
위에서 부풀린 레이아웃 파일은 (login.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Username" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Username" />
</LinearLayout>
다음을 설정하고 싶습니다.paddingTop
위와 같이<LinearLayout>
요소, 그리고 xml로 하는 대신 자바 코드로 하고 싶습니다.
설정 방법paddingTop
로.<LinearLayout>
내 단편 자바 클래스 코드에?
view.setPadding(0,padding,0,0);
상단 패딩을 다음으로 설정합니다.padding
-어쨌든.
설정할 경우dp
대신 변환을 수행할 수 있습니다.
float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);
두 번째 질문에 답하기 위해:
view.setPadding(0,padding,0,0);
SpK와 Jave가 제안한 대로 패딩을 픽셀 단위로 설정합니다.다음과 같이 dp 값을 계산하여 dp로 설정할 수 있습니다.
int paddingDp = 25;
float density = context.getResources().getDisplayMetrics().density
int paddingPixel = (int)(paddingDp * density);
view.setPadding(0,paddingPixel,0,0);
패딩을 리소스 파일에 저장하는 경우 간단히 호출할 수 있습니다.
int padding = getResources().getDimensionPixelOffset(R.dimen.padding);
그것은 당신을 위해 변환을 해줍니다.
Kotlin과 Android-ktx 라이브러리를 사용하면 간단히 할 수 있습니다.
view.updatePadding(top = 42)
아래 코드 전체에 걸쳐 프로그래밍 방식으로 패딩을 사용자의 보기에 설정할 수 있습니다.
view.setPadding(0,1,20,3);
그리고, 다양한 종류의 패딩을 사용할 수 있습니다 -
이 링크는 Android Developers 사이트를 참조합니다.이것이 당신에게 많은 도움이 되길 바랍니다.
사용.TypedValue
수동으로 다음을 계산하는 것에 비해 픽셀로 변환하는 방법이 훨씬 깔끔합니다.
float paddingDp = 10f;
// Convert to pixels
int paddingPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingDp, context.getResources().getDisplayMetrics());
view.setPadding(paddingPx, paddingPx, paddingPx, paddingPx);
기본적으로,TypedValue.applyDimension
현재 장치의 디스플레이 속성에 따라 원하는 패딩을 픽셀로 적절하게 변환합니다.
자세한 내용은 다음을 참조하십시오.Value.applyDimensionDocs를 입력합니다.
코틀린; 확장 함수
fun Float.px(m: DisplayMetrics!): Int
get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, m).toInt()
...
val pad = 10.0f.px
설정에는 다음 방법을 사용padding
동적으로
setPadding(int left, int top, int right, int bottom)
예:
view.setPadding(2, 2, 2, 2);
여기서 패딩이 적용된 섹션을 확인할 수 있습니다.
bidding.subHeader.tvSubHeader.setPadding(0, 5, 0, 0);
누군가가 이 답변을 편집했지만 이전에 제거된 이미지를 추가했습니다. 다시 여기 있습니다.
1단계: 먼저 패딩 값을 정수로 사용합니다.
int padding = getResources().getDimensionPixelOffset(R.dimen.padding);
또는 int padding = 16;
[어떤 방법이든 사용]
2단계: 그런 다음 패딩 값을 레이아웃에 할당합니다.
layout.setPadding(padding, padding, padding, padding);
layout.setPadding(padding_left, padding_top, padding_right, padding_bottom);
모든 면에 다른 패딩을 할당할 수 있습니다.layout.setPadding(16, 10, 8, 12);
패딩 제거(패딩 없음)의 경우 패딩 값을 0으로 설정합니다.
layout.setPadding(0, 0, 0, 0);
패딩을 설정하려면 다음 코드를 작성하십시오. 도움이 될 수 있습니다.
TextView ApplyPaddingTextView = (TextView)findViewById(R.id.textView1);
final LayoutParams layoutparams = (RelativeLayout.LayoutParams) ApplyPaddingTextView.getLayoutParams();
layoutparams.setPadding(50,50,50,50);
ApplyPaddingTextView.setLayoutParams(layoutparams);
사용하다LinearLayout.LayoutParams
또는RelativeLayout.LayoutParams
하위 보기의 상위 레이아웃에 따라
Context context = MainActivity.this;
TextView tView = new TextView(context);
tView.setPaddingRelative(10,0,0,0);
가장 좋은 방법은 자신의 함수를 쓰지 않는 것입니다.
동기를 설명해 드리겠습니다 - 공식 안드로이드 소스 코드를 찾아보세요.
TypedValue.java
다음이 있습니다.
public static int complexToDimensionPixelSize(int data,
DisplayMetrics metrics)
{
final float value = complexToFloat(data);
final float f = applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
value,
metrics);
final int res = (int) ((f >= 0) ? (f + 0.5f) : (f - 0.5f));
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;
}
그리고:
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
당신이 볼 수 있듯이.DisplayMetrics metrics
차이가 있을 수 있습니다. 즉, Android-OS 전원 장치마다 다른 값을 산출합니다.
저는 dp 패딩을 dimension xml 파일에 넣고 안드로이드 프레임워크가 어떻게 작동하는지에 대해 일관된 행동을 하기 위해 공식 안드로이드 변환을 사용하는 것을 강력히 추천합니다.
제이브의 솔루션을 사용합니다.
public static int getResourceDimension(Context context, String name, String defType, String defPackage) {
int sizeInDp = 0;
int resourceId = context.getResources().getIdentifier(name, defType, defPackage);
if (resourceId > 0) {
sizeInDp = context.getResources().getDimensionPixelSize(resourceId);
}
float scale = context.getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);
return dpAsPixels;
}
그런 다음 필요할 때 전화하십시오.
int statusBarHeight = getResourceDimension(getContext(), "status_bar_height", "dimen", "android");
statusBarHeight = (int) (statusBarHeight + getResources().getDimension(R.dimen.fragment_vertical_padding));
view.setPadding(0, statusBarHeight, 0, 0);
프로그래밍 방식으로 패딩하는 동안 픽셀을 Dp로 변환하여 밀도 관련 값으로 변환합니다.
binding.appBarMain.toolbar.setOnApplyWindowInsetsListener { _, insets ->
val statusBarSize: Int =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
insets.getInsets(WindowInsets.Type.systemBars()).top
} else {
insets.systemWindowInsetTop
}
binding.appBarMain.appBarLayout.setPadding(0, statusBarSize, 0, 0)
return@setOnApplyWindowInsetsListener insets
}
언급URL : https://stackoverflow.com/questions/9685658/add-padding-on-view-programmatically
'programing' 카테고리의 다른 글
파일 생성을 위해 BLOB를 Ajax를 통해 전달 (0) | 2023.07.27 |
---|---|
Android 지도 v2 확대/축소를 통해 모든 마커 표시 (0) | 2023.07.27 |
입력 값이 배열에 있는지 확인하는 방법(Powershell) (0) | 2023.07.27 |
편집 텍스트 내의 그리기 테이블에서 클릭 이벤트 처리 (0) | 2023.07.27 |
작업 스케줄러에서 실행할 때 PowerShell 출력을 리디렉션하려면 어떻게 해야 합니까? (0) | 2023.07.27 |