본문 바로가기
Android/Dev

LayoutParams의 사용시 주의점, Dp를 Px로 변환하기

by featherwing 2020. 4. 3.
728x90
반응형

1. LayoutParams 사용시 주의점

2. Dp를 Px로 변환하기

 

 


 

1. LayoutParams 사용시 주의점

 

이전에 Layout의 속성을 xml이 아닌 code상에서 조절하는 방법에 대해서 짧게 글을 쓴 적이 있습니다.

 

LayoutParam의 사용방법에 대해서 약간 더 내용을 추가하고자 합니다.

 

xml의 속성이 다음과 같은 Layout을 가정해 봅시다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tool="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:id="@+id/linear1"
        android:layout_width="wrap_content"
        android:layout_height="56dp"
        android:orientation="vertical">
                
         <TextView
            android:id="@+id/textview1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="test"/>
               
       </LinearLayout>         
</RelativeLayout>

해당 레이아웃에서 LinearLayout의 height를 Code상에서 56dp에서 48dp로 조절하기 위해서는 

 

아래와 같은 방법을 이용하여야 합니다.

LinearLayout mLinearLayout = findViewById(R.id.linear1);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ConvertDPtoPX(this,48));
mLinearLayout.setLayoutParams(params);



  public static int ConvertDPtoPX(Context context, int dp) {
        float density = context.getResources().getDisplayMetrics().density;
        return Math.round((float) dp * density);
    }

 

*ConvertDptoPx에 대해서는 아래의 2. Dp를 Px로 변환하기 에서 확인 해 주세요

 

여기서 주의할 부분은 다음과 같이 LinearLayout의 height를 조절하기 위해서 부여한 속성이

 

RelativeLayout.LayoutParams 라는 것입니다.

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ConvertDPtoPX(this,48));

 

즉, LayoutParams의 종류는 조절할 View가 아니라 조절할 View의 부모 View으로 정해주어야 합니다.

 

LinearLayout mLinearLayout = findViewById(R.id.linear1);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ConvertDPtoPX(this,48));
mLinearLayout.setLayoutParams(params);

위와 같이 부모 View가 RelativeLayout인데도 조절할 View인 LinearLayout을 대상으로 하여 아래와 같이 LayoutPararams의 종류를 LinearLayout.LayoutParams 으로 설정해준다면 

 

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams

 

이라는 오류를 뿜으면서 crash가 발생하는 것을 확인할 수 있습니다.

 


 

2. Dp를 Px로 변환하기

 

코드상에서 크기를 조절할 때 주의할 부분은 또 있습니다.

 

xml에서 height등에서 사용하는 수치는 보통 Dp를 사용합니다. 

 

그런데, LayoutParams(width,height); 에서 입력하는 수치는 Px을 입력하게됩니다.

 

즉, 숫자를 그대로 넣으면 Px로 적용되어, 기기마다 다른 크기를 가지게 됩니다.

 

따라서 xml에서 사용하는 dp수치로 입력하기 위해서는 따로 수치를 변환해주어야 합니다.

 

Dp를 Px로 전환해 주는 아래의 코드를 이용하면 xml에서 입력하는것 처럼 사용할 수 있습니다.

  public static int ConvertDPtoPX(Context context, int dp) {
        float density = context.getResources().getDisplayMetrics().density;
        return Math.round((float) dp * density);
    }

 

728x90
반응형

댓글