안드로이드 앱 개발을 하다 보면 XML 레이아웃에 미리 정의하지 않고 코드에서 동적으로 뷰(View)를 생성해야 하는 경우가 자주 있습니다. 이럴 때는 생성된 뷰의 실제 크기, 즉 너비와 높이를 알아내야 할 필요가 생기는데요. 이번 글에서는 안드로이드에서 뷰의 크기를 간단하게 구하는 방법을 단계별로 살펴보겠습니다.
뷰 크기를 구하는 핵심 메서드
뷰의 높이를 구하려면 다음 코드를 사용합니다.
int height = view.getMeasuredHeight();
뷰의 너비를 구하려면 다음 코드를 사용합니다.
int width = view.getMeasuredWidth();
여기서 view는 TextView, EditText, Button 등 어떤 뷰든 상관없습니다. 다만 주의할 점은, 너비와 높이를 조회하기 전에 반드시 해당 뷰에 대해 측정(measure)을 먼저 수행해야 한다는 것입니다.
view.measure(0, 0);
measure(0, 0)은 MeasureSpec.UNSPECIFIED를 전달하는 호출로, 뷰가 콘텐츠에 맞춰 원하는 크기를 스스로 계산하도록 지시하는 역할을 합니다.
예제로 배우는 뷰 크기 측정
1단계 — 새 프로젝트 생성
Android Studio에서 File → New Project를 선택한 후, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계 — activity_main.xml 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
위 레이아웃에는 자식 뷰가 하나도 없고 루트(부모) 뷰만 존재합니다. 자식 뷰는 아래와 같이 Java 코드에서 동적으로 추가할 수 있습니다.
3단계 — MainActivity.java 작성
import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
ConstraintLayout constraintLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView msg = new TextView(this);
msg.setText("크기 측정용 샘플 텍스트");
msg.setPadding(10, 10, 10, 10);
msg.measure(0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(5, 15, 0, 0);
msg.setLayoutParams(params);
msg.setGravity(Gravity.CENTER);
LinearLayout layout = (LinearLayout) findViewById(R.id.rootview);
layout.addView(msg);
int width = msg.getMeasuredWidth();
int height = msg.getMeasuredHeight();
Toast.makeText(this, "width " + String.valueOf(width) + " height " + String.valueOf(height), Toast.LENGTH_LONG).show();
}
}위 예제에서는 TextView를 동적으로 생성한 뒤 setText(), setPadding(), setGravity() 등의 속성을 설정했습니다. 또한 다음과 같이 레이아웃 파라미터(LayoutParams)도 지정했습니다.
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(5, 15, 0, 0); msg.setLayoutParams(params);
그다음 생성한 TextView를 부모 뷰에 추가합니다.
LinearLayout layout = (LinearLayout) findViewById(R.id.rootview); layout.addView(msg);
마지막으로 getMeasuredWidth()와 getMeasuredHeight()를 호출해 TextView의 너비와 높이를 구하고, 그 결과를 Toast로 화면에 표시했습니다.
int width = msg.getMeasuredWidth(); int height = msg.getMeasuredHeight(); Toast.makeText(this, "width " + String.valueOf(width) + " height " + String.valueOf(height), Toast.LENGTH_LONG).show();
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run(실행) 아이콘을 클릭하고, 목록에서 자신의 모바일 기기를 선택하면 기기 화면에 결과가 표시됩니다.

위 화면에서 확인할 수 있듯이, TextView의 너비와 높이가 Toast 메시지로 출력되는 것을 볼 수 있습니다.