たとえば、「ButtonをクリックするとTextViewに表示されている文字列が変わる」などJavaプログラムから画面上に配置されているViewを操作するにはまず、その対象となるViewをインスタンス化する必要があります。
ActivityとレイアウトXMLファイルの紐づけにはリソースIDを使用しました。
同じようにレイアウトXMLファイル内で定義したView要素をJavaプログラム中から参照するにもリソースIDを使用します。
レイアウトXMLに定義されているViewにリソースIDを付与するには、「android:id」属性を使用します。
リソースID は「android:id」属性で定義した値の「@+id/」以降となります。
<TextView android:id="@+id/textView1" android:text="TextView" />
この例では、TextViewにリソースID「textView1」を付けました。
次に、JavaプログラムでレイアウトXMLファイルで定義されているViewをインスタンス化するには、ActivityクラスのfindViewById()メソッドを使用します。
以下はfindViewById()メソッドのシグネチャです。引数にはXMLで定義したリソースIDを指定します。
public View findViewById (int id)
このメソッドは戻り値にViewを返すため、適切にキャストしてあげる必要があります。
以下のように使用します。
TextView textView = (TextView)findViewById(R.id.textView1);
引数のリソースIDには「R.id.textView1」が指定されています。「R.id.」という部分がView(この場合はTextView)に指定したリソースIDであることを表し、「textView1」の部分がレイアウトXMLファイルに定義したTextViewタグの「android:id=@+id/」以降を表します。
なお、このメソッドの実行はsetContentView()メソッドを実行した後に行う必要があります。
これは、あらかじめActivityとレイアウトXMLの紐づけを行っておかないと、指定したリソースIDのViewを見つけることができないためです。
仮にsetConentView()メソッドの実行前にfindViewById()メソッドを実行してしまうと、findViewById()メソッドの実行結果がnullとなり、結果的にNullPointerExceptionが発生してアプリケーションが強制終了してしまうことになります。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // NG 変数textViewがnullとなってしまうため // TextView textView = (TextView) findViewById(R.id.textView1); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.textView1); // OK } }
このようにsetContentView()メソッドを使った紐付けとfindViewById()メソッドを使ったインスタンス化は処理の順番に気を付けてください。