これまたよく見かける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>
アプリ画面
以上の記述をビルドしてアプリを起動すると、「新住所を確認」ボタンと「旧住所を確認」ボタンが表示されます。
「新住所を確認」ボタンをタッチすると、Googleマップで現在の事務所の場所が表示されます。
「旧住所を確認」ボタンをタッチすると、Googleマップで以前の事務所の場所が表示されます。
おひれ
今回調べた中で、findViewByIdは、とても重要な要素であることが分かったのですが、この記述が面倒だという意見もたくさん見ました。たしかにビューの数が増えて、それぞれの役割がある場合、たくさんfindViewByIdを記述する必要があります。そんな時は、プラグインやツールを使って、簡単に記述できるようにしたり、記述量を減らしたりするという工夫がありますが、それについては、また後日メモしたいと思います。
【参考サイト】
・Activity | Android Developers
コメント
コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)