Android xml レイアウトのオブジェクトを取得して操作する

Android Eclipseでの新規作成プロジェクトを読み解いてみる のエントリの Eclipse で生成したデフォルトプロジェクトをベースに、レイアウトについて学んでみる。

main.xml で定義したビューオブジェクトを操作する

生成されたプロジェクトの res/layout/main.xml には、ひとつの LinerLayout と TextView が配置されていました。

TextView に表示する文字列は、res/values/strings.xml に定義された hello を android:text=”@string/hello” で参照することで、ラベルに Hello World, DemoActivity! と表示していました。

このラベル文字列を、コード中で動的に変更する方法について、つまり xml で定義されたオブジェクトにはどうやって、アクセスするのかを調べます。

Android コーディングレイアウトとxmlレイアウト で書いたように、コード中でビューオブジェクトのインスタンスを生成し、メソッドで属性を指定するように、xml で定義されたオブジェクトを一度、インスタンスとして取得し、同じようにメソッドを使うことで、動的に属性の操作を行います。

ビューオブジェクトを取得するにはActivityクラスの findViewById() にオブジェクトの ID を渡すと取得できます。

ビューオブジェクトに ID をつける

まず、TextView に固有の ID をつけます。HTML と似たようなモンです。

<TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />

android:id=”@+id/label” という行を足し、ID として “@+id/label” を割り当てています。

すると R.java が更新されて、コード中で R.id.label としてこの TextView のID を参照できるようになります。

@+id/ ではじめるのが慣例、とよく見かけるのですが、他の書き方があるんでしょうか?

とりあえず、ID の指定はこうやって書く、という決まりとして捕らえておくことにします。

findViewById() でビューオブジェクトを取得する

ID を持たせたので、コード中で、findByView( R.id.label ) で取得します。

    private TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.tv = (TextView)this.findViewById(R.id.label);
        this.tv.setText( "rewrited in onCreate()." );
    }

findViewById() は View オブジェクトを返すので、キャストが必要です。

findViewById() で見つけられるのは読み込み済みのレイアウトからなので、setContentView() で読み込む前に使ってしまうと取得できません。

tv に一度格納して、text 属性を指定する setText() メソッドを使います。

ここでは、直接文字列を渡していますが、R.string.hoge など、res/values/strings.xml に定義したリソースを渡したりも出来ます。

tv をプロパティにしたのは、アクティビティ内で参照することがあることを想定した実装をしてみただけです。

動作を確認

これを起動すると、アクティビティ生成時に、”Hello World, DemoActivity!” と表示されていたところが “rewrited in onCreate().” に書き換わって表示されます。

あまり動的という感じがしませんが、たとえば、あるボタンを押したときに、setText() でラベルの内容を書き換えるといったような操作は、このようにするのでしょう。

TextView の setText() しか扱いませんでしたが、Button や Layout も同様の方法で取得し、各クラスの持つメソッドで属性をセットする、というやり方は同じなので、これさえ掴んでおけば、全てのオブジェクトの操作は身に付いたといってもよいんじゃないでしょうか。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする