Mono Works

チラシのすきま

メモ:findViewByIdについて

これまたよく見かけるfindViewByIdについてのメモ。字面から、「idでViewを見つける」んだなということはなんとなく想像できます。

idと言えば、下記メモで、xmlに定義されたリソースにIDを割り振って、R.javaファイルに保存するということを書きました。リソースに割り振られたIDを使って、java側でリソースを利用するための架け橋が「findViewById」です。

メモ:「id="@+id/名前"」という構文について - Mono Works

では、そのリソースIDがどのxmlファイルに定義されているのかというのは、「setContentView」で設定しています。この辺については、下記メモに書いてます。 メモ:setContentViewについて - Mono Works

開発者サイトを調べていると、Activityのクラス概要にsetContentViewとfindViewByIdに関する記述を見つけました。onCreate()とsetContentViewとfindViewByIdを一緒に使うのが基本のようです。

Class Overview

onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource defining your UI, and using findViewById(int) to retrieve the widgets in that UI that you need to interact with programmatically.

具体的に「findViewById」がどんな風に使われているのか、実際のコードで見てみます。

サンプルコード

下記例では、ひとつの画面に2つのボタン(ビュー)を配置して、それぞれ異なる動作を割り当てています。

まず、xmlファイルにボタンを2つ配置して、それぞれにIDを割り当てます。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/new_adress"
    android:id="@+id/button_new"    <!-- ひとつ目のButtonに「button_new」というIDを割当 -->
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/old_adress"
    android:id="@+id/button_old"    <!-- ふたつ目のButtonに「button_old」というIDを割当 -->
    android:layout_below="@id/button_new" <!-- ひとつ目のButtonの下に配置 -->
    android:layout_marginTop="20dp"
    android:layout_centerHorizontal="true" />

</RelativeLayout>

続いて、javaファイルでは、ボタンに割り当てられたIDからそれぞれに名前と役割を記述しています。

MainActivity.java

package jp.co.monoworks.opengooglemap2;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    // ID:button_newにbtnNew、ID:button_oldにbtnOldという名前を割当
        Button btnNew = (Button) this.findViewById(R.id.button_new);
        Button btnOld = (Button) this.findViewById(R.id.button_old);

    // btnNewの動作
        btnNew.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Uri gmUri = Uri.parse("geo:35.684331,139.735232?z=19"); //現在の住所
                Intent gmIntent = new Intent(Intent.ACTION_VIEW, gmUri);
                gmIntent.setPackage("com.google.android.apps.maps");
                startActivity(gmIntent);
            }
        });

    // btnOldの動作
        btnOld.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Uri gmUri = Uri.parse("geo:35.6885904,139.7208679?z=19"); //旧住所
                Intent gmIntent = new Intent(Intent.ACTION_VIEW, gmUri);
                gmIntent.setPackage("com.google.android.apps.maps");
                startActivity(gmIntent);
            }
        });
    }
}

strings.xmlにボタンに表示する名前を定義します。

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="app_name">OpenGoogleMaps2</string>
  <string name="new_adress">新住所を確認</string>
  <string name="old_adress">旧住所を確認</string>
</resources>

アプリ画面

以上の記述をビルドしてアプリを起動すると、「新住所を確認」ボタンと「旧住所を確認」ボタンが表示されます。

androiddevmemo20150915_01

「新住所を確認」ボタンをタッチすると、Googleマップで現在の事務所の場所が表示されます。

androiddevmemo20150915_02

「旧住所を確認」ボタンをタッチすると、Googleマップで以前の事務所の場所が表示されます。

androiddevmemo20150915_03

おひれ

今回調べた中で、findViewByIdは、とても重要な要素であることが分かったのですが、この記述が面倒だという意見もたくさん見ました。たしかにビューの数が増えて、それぞれの役割がある場合、たくさんfindViewByIdを記述する必要があります。そんな時は、プラグインやツールを使って、簡単に記述できるようにしたり、記述量を減らしたりするという工夫がありますが、それについては、また後日メモしたいと思います。

【参考サイト】

Activity | Android Developers

メモ:「id=”@+id/名前”」という構文について(Android) | Mono Works

メモ:setContentViewについて(Android) | Mono Works

コメント

コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)
執筆者
"ぽぽろんち" @pporoch
pporoch120
Mono Worksの中の人。好きなことをつらつらと書き留めてます。
ギターを始めてから 練習動画をYouTubeにアップしてます。ご笑納ください。
"DQX@ぬここ(UD487-754)、コツメ(NO078-818)"
採用案内