프로그래밍 방식으로 뷰에 패딩 추가


235

Android v2.2 앱을 개발 중입니다.

나는이 조각을 .

onCreateView(...)내 조각 클래스 의 콜백에서 다음과 같이 조각을 레이아웃에 팽창시킵니다.

@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>내 조각 자바 클래스 코드에 ??


2
LinearLayout에 ID를 할당하여 찾아서 findViewById호출 할 수 있도록해야 setPadding합니다.
— Aleks G

@AleksG 일반적으로 그렇습니다. 그러나 LinearLayout은 여기서 필요하지 않은 팽창 된 계층 구조의 근본 요소입니다. view이미 LinearLayout이므로이 경우 다시 찾을 필요가 없습니다. 그러나 이것은 특별한 것입니다.

1
@ alextsc : 예, 동의합니다. 그럼에도 불구하고, 나는 여전히 신청서에서 언급 할 수있는 것에 ID를 할당하는 것을 선호합니다.
— Aleks G

답변:


486

view.setPadding(0,padding,0,0);

상단 패딩이- padding픽셀로 설정됩니다 .

dp대신 설정 하려면 변환을 수행 할 수 있습니다 .

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);

6
Chris가 말한 것처럼 @ Leem.fin은 픽셀입니다. dp를 원한다면 수동으로 변환을 수행해야합니다.float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
— Jave

7
0.5f는 어디에서 오는가?
— Herr von Wurst

11
@Georg이 코드는 여기에서 가져온 것입니다 : developer.android.com/guide/practices/… 0.5는 캐스팅 할 때 가장 가까운 정수를 얻는 데 사용됩니다 (Math.round ()를 사용하는 대신)
— Jave

변수 이름은 다른 방법이어야한다고 생각합니다. sizeInDp실제로 sizeInPxdps를 변환 할 때 얻는 픽셀 수입니다 .
— friederbluemle

99

두 번째 질문에 대답하려면 :

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

희망이 도움이됩니다!


3
물론 이것은 예상대로 컴파일되고 작동하지만 명확성을 위해 int 변수의 이름을 바꿔야합니다. DP에서 패딩을 정의하고이 지정된 장치에 대해 픽셀 단위로 계산할 것이기 때문입니다.
— 글렌 85

dp를 픽셀로 변환 중입니다. 변수 이름이 혼동됩니다. "paddingPixel"은 실제로 dp를 의미합니다
— Jiechao Wang

92

패딩을 리소스 파일에 저장하면 간단히 전화 할 수 있습니다.

int padding = getResources().getDimensionPixelOffset(R.dimen.padding);

그것은 당신을 위해 변환을 수행합니다.




9

사용 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현재 장치의 디스플레이 속성에 따라 원하는 패딩을 픽셀로 적절히 변환합니다.

자세한 정보는 TypedValue.applyDimension Docs를 참조하십시오 .


1
px와 dp를 반대로 바꿔서는 안됩니까?
— chris838

나는 내가하고있는 일의 요지가 맞다고 생각한다. 그러나 이름이 혼란 스럽다고 생각합니다. 더 명확하게 편집하겠습니다. 피드백 감사드립니다.
— i2097i December

7

패딩을 동적으로 설정하기 위해 아래 방법을 사용하십시오.

setPadding(int left, int top, int right, int bottom)

예 :

view.setPadding(2,2,2,2);

3

다음 코드를 작성하여 패딩을 설정하면 도움이 될 수 있습니다.

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아이 뷰의 부모 레이아웃에 따라


setPadding ()은 LayoutParams에서 액세스 할 수있는 메소드가 아닙니다. 나는 그것이 확실하지 않다.
— 스리 람

2
Context contect=MainActivity.this;
TextView tview=new TextView(context);
tview.setPaddingRelative(10,0,0,0);

4
이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명은 크게이 문제에 대한 좋은 해결책이 왜 보여 장기적인 가치를 향상 것이고, 다른 유사한 질문을 미래의 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
— 염소 자리

0

프로그래밍 방식으로 패딩하는 동안 픽셀을 Dp로 변환하여 밀도 관련 값으로 변환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.