静的リソースの変更
ここでGraphical Layoutの画面に戻って、ボタンとTextViewコンポーネントを追加してみましょう。左のパレット欄から、ボタンとTextViewをドラッグして貼り付けます。これをそのまま実行すると、次のようになります。CTRL+F11キーでエミュレータ画面の縦横の切り替えてみても、ちゃんと一列に並んでいます。
次に、ボタンに表示される文字列を変更してみましょう。ボタンの上で右クリックして、メニューを表示させ、Edit Textを選択します。すると文字列リソースの選択画面になります。まだ文字列リソースは作成していませんので、「New String...」ボタンをクリックします。
文字列リソース作成画面になりますので、IDとしてbutton_str1(任意の文字列)、文字列の値に「サンプル実行」とします。そのままOKをクリックしてリソース選択に戻り、button_str1を指定します。
これで、ボタンの文字列を変更しました。
が、Android Layout Editorには、次のように正しくボタンの文字が表示できていません。
これはAndroid Layout Editor上の表示のみの問題ですが、このあたりまだ発展途上といえます。今のところこれを回避するには、文字列の最後を半角文字にすることです。たとえば、「 サンプル実行 」と前後に半角のスペースを加えればちゃんと表示できます。
リソースを動的に変更する
ここまでの説明は、XMLファイルで画面のレイアウトを行う方法です。ただ、もちろんすべてのリソースを静的に定義できないケースもあります。その場合は、リソースIDを利用して、リソースをプログラムから動的に変更します。
リソースIDは、Android Layout Editor上でも確認できます。さきほど追加したTextViewのコンポーネント上でマウスを右クリックし、メニューを表示させて、Edit IDを選択します。textView1と表示されるはずです。
リソースはRクラスに定義されているのでしたね。R.javaには、以下のように定義されているはずです。
public final class R { public static final class id { public static final int button1=0x7f050000; public static final int textView1=0x7f050001; }
ではこのIDを使って、TextViewの文字を変更してみます。
package codezine.androidjava.chap1; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloAndroid extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tview = (TextView)findViewById(R.id.textView1); tview.setText("動的に設定します"); } }
リソースIDから、GUIオブジェクトを取得するには、Activityクラスに用意されているfindViewByIdメソッドを用います。引数にリソースIDを指定すると、それに対応するViewオブジェクトが返されます。Viewクラスは、すべてのGUIコンポーネントのスーパークラスになっていますので、サンプルでは、TextViewクラスにキャストにしています。
文字列の変更は、TextViewクラスのsetTextメソッドを用います。setTextメソッドは、このように引数で直接文字列するか、または文字列のリソースIDを指定します。