Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidでビューのサイズ(幅・高さ)を取得する方法をわかりやすく解説

Androidアプリ開発では、XMLレイアウトにあらかじめビューを定義するのではなく、Javaコードから動的にビューを生成したいケースが多くあります。動的に生成したビューは、画面に描画されるまで実際のサイズが確定しないため、幅や高さを取得してレイアウトを調整したり、他の処理に活用したりする必要があります。

この記事では、Androidでビューのサイズ(幅・高さ)を取得するシンプルな方法を、サンプルコード付きで解説します。

ビューのサイズを取得する基本の方法

ビューの高さと幅を取得するには、それぞれ次のメソッドを使用します。

ビューの高さを取得する

int height = view.getMeasuredHeight();

ビューの幅を取得する

int width = view.getMeasuredWidth();

重要なポイント:measure()を呼び出す

ここで注意すべき点があります。getMeasuredWidth()getMeasuredHeight()を呼び出す前に、必ずmeasure()メソッドでビューの計測を実行しておく必要があります。計測されていない状態でこれらのメソッドを呼び出すと、0が返されてしまいます。

view.measure(0, 0);

上記のコードのviewには、TextViewやEditText、Buttonなど任意のビューが入ります。

サンプルプロジェクト:動的に生成したTextViewのサイズを取得する

それでは、実際にビューのサイズを取得するサンプルアプリを作成してみましょう。この例では、Javaコードから動的に生成したTextViewの幅と高さを取得し、Toastで表示します。

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、メニューから「File」→「New Project」を選択して、必要な情報を入力し新しいプロジェクトを作成します。

ステップ2:activity_main.xmlにコードを追加する

res/layout/activity_main.xml に以下のコードを記述します。この例では子ビューを持たないルートビュー(親ビュー)としてLinearLayoutのみを定義しています。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/rootview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
</LinearLayout>

XMLレイアウトには何もビューを配置していません。代わりに、Javaコード側から子ビューを追加していきます。

ステップ3:MainActivity.javaにコードを追加する

MainActivity.javaに以下のコードを記述します。TextViewを動的に生成し、テキストやパディングなどのプロパティを設定した後、サイズを取得してToastで表示しています。

import android.os.Bundle;
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 {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 動的にTextViewを生成
        TextView msg = new TextView(this);
        msg.setText("sample text for checking dimensions");
        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);
        // 親ビューにTextViewを追加
        LinearLayout layout = (LinearLayout) findViewById(R.id.rootview);
        layout.addView(msg);
        // サイズを取得してToastで表示
        int width = msg.getMeasuredWidth();
        int height = msg.getMeasuredHeight();
        Toast.makeText(this, "width " + String.valueOf(width)
                + " height " + String.valueOf(height), Toast.LENGTH_LONG).show();
    }
}

※なお、元のコードでは変数名が入れ替わっていたため(width変数にgetMeasuredHeight()を代入していた)、上記では正しく修正しています。変数名と取得する値の対応に注意してください。

コードのポイント解説

1. TextViewの動的生成とプロパティ設定

この例では、new TextView(this)でTextViewを動的に生成し、setText()でテキストを設定、setPadding()で余白を指定、setGravity()で中央揃えにしています。

2. レイアウトパラメータの指定

LayoutParamsを使って、ビューのサイズをWRAP_CONTENT(内容に合わせたサイズ)に設定し、マージンも指定しています。

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(5, 15, 0, 0);
msg.setLayoutParams(params);

3. 親ビューへの追加

findViewById()でXMLで定義したルートのLinearLayoutを取得し、addView()で動的に生成したTextViewを追加します。

LinearLayout layout = (LinearLayout) findViewById(R.id.rootview);
layout.addView(msg);

4. サイズの取得と表示

最後に、getMeasuredWidth()getMeasuredHeight()でビューの幅と高さを取得し、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スマートフォンをパソコンに接続しているものとします。Android Studioから実行するには、プロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。表示された選択肢から接続中のモバイルデバイスを選択してください。

アプリが起動すると、デバイスの画面にTextViewが表示され、その幅と高さの値がToastとしてポップアップ表示されます。

Androidでビューのサイズ(幅・高さ)を取得する方法をわかりやすく解説

上記の画面のように、ToastでTextViewの寸法(widthとheight)が取得できていれば成功です。

まとめ

動的に生成したビューのサイズを取得する手順をまとめると、以下の3ステップです。

  • measure(0, 0) を呼び出してビューを事前に計測する
  • getMeasuredWidth() で幅を取得する
  • getMeasuredHeight() で高さを取得する

特にmeasure()の呼び出しを忘れると常に0が返される点は、初心者がつまずきやすいポイントです。動的レイアウト構築の際には、ぜひこの方法を活用してください。

  1. Androidでアクションバー(Toolbar)の高さを取得する方法をステップ解説

    この記事では、Androidアプリでアクションバー(Toolbar)の高さを取得する方法を、実際のコード例とともにステップ形式で解説します。ボタンをタップすると、アクションバーの高さがピクセル単位で画面に表示されるシンプルなサンプルアプリを作成していきます。 手順1:新しいプロジェクトを作成する Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。 手順2:activity_main.xml にコードを追加する res/layout/activity_main.xml に以下の

  2. 【Android】エミュレータのIPアドレスを取得して表示する方法を解説

    はじめにこの記事では、Androidアプリから端末(エミュレータ/実機)のIPアドレスを取得し、画面に表示する方法を、実際のサンプルコードとともにステップ形式で解説します。Wi-Fi接続情報を利用したシンプルな実装例なので、Android開発初心者の方にもわかりやすい内容となっています。手順1:新規プロジェクトの作成まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。手順2:レイアウトファイル(activity_main.xml)の編集res/layout/acti