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


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.