Androidアプリ開発 Parcelable 画面遷移時にパラメーターをオブジェクトで渡す

2016年07月08日(編集2016年07月08日)
このエントリーをはてなブックマークに追加

Androidアプリで画面遷移時に、パラメーターにオブジェクトを渡すことができます。
この記事は、画面遷移時にパラメーターを渡す方法を記載した記事です。

環境はAndroid 6.0 (API level 23) です。

環境

  • OS X Yosemite
  • Oracle jdk version 1.8.0_72
  • Android Studio 2.1.2
  • android sdk 23

難易度

初心者向け

Parcelable

Parcelableはクラスのためのインターフェースです。Parcelableを実装したインスタンスクラスは、Parcelからデータを書き/読みすることができます。
Parcelableを実装したインスタンスクラスは、Intentにデータとして設定することもできます。

実装

一覧画面から詳細画面に遷移する時に、パラメーターとしてモデルオブジェクトを渡す場合は、以下の様に実装します。

{project_folder}/ui/SampleActivity.java
        Intent intent = new Intent(this, NextActivity.class);
        intent.putExtra("object", item);
        startActivity(intent);
        

この時、IntentのputExtraメソッドは、StringとParcelableを引数に取ります。Parcelableは、Parcelableをimplementsしているクラスです。

Parcelable実装

Parcelableを実装しないクラスコードは以下になります。

{project_folder}/model/Dau.java
/**
 * Copyright (C) 2016 Programming Java Android Development Project
 * Programming Java is
 *
 *      http://java-lang-programming.com/
 *
 * Model Generator version : 1.0.4
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.java_lang_programming.android_sqlite_demo.model;

import android.text.TextUtils;

/**
 * An Model class for Dau
 */
public class Dau {

    public static final String TAG = "Dau";
    // table name
    public static final String TABLE_NAME = "Dau";
    // table name aliases
    public static final String TABLE_NAME_OMISSION = "D";
    // カラム配列
    public static final String [] COL = new String [] {"id","dau_date","opening_price","high_price","low_price","closing_price","change_price","deleted_at","created_at","updated_at"};

    // id
    public String id;
    // dau_date
    public String dau_date;
    // opening_price
    public String opening_price;
    // high_price
    public String high_price;
    // low_price
    public String low_price;
    // closing_price
    public String closing_price;
    // change_price
    public String change_price;
    // deleted_at
    public String deleted_at;
    // created_at
    public String created_at;
    // updated_at
    public String updated_at;

    @Override
    public String toString() {
        StringBuffer str = new StringBuffer();
        str.append("Dau [");
        if (!TextUtils.isEmpty(id)) {
            str.append(" id=" + id);
        }
        if (!TextUtils.isEmpty(dau_date)) {
            str.append(", dau_date=" + dau_date);
        }
        if (!TextUtils.isEmpty(opening_price)) {
            str.append(", opening_price=" + opening_price);
        }
        if (!TextUtils.isEmpty(high_price)) {
            str.append(", high_price=" + high_price);
        }
        if (!TextUtils.isEmpty(low_price)) {
            str.append(", low_price=" + low_price);
        }
        if (!TextUtils.isEmpty(closing_price)) {
            str.append(", closing_price=" + closing_price);
        }
        if (!TextUtils.isEmpty(change_price)) {
            str.append(", change_price=" + change_price);
        }
        if (!TextUtils.isEmpty(deleted_at)) {
            str.append(", deleted_at=" + deleted_at);
        }
        if (!TextUtils.isEmpty(created_at)) {
            str.append(", created_at=" + created_at);
        }
        if (!TextUtils.isEmpty(updated_at)) {
            str.append(", updated_at=" + updated_at);
        }
        str.append("]");
        return str.toString();
    }
}
        

上記はダウのデータを保存するモデルクラスです。
これにParcelableを実装して、Intentでデータの受け渡しをできるようにします。

{project_folder}/model/Dau.java
/**
 * Copyright (C) 2016 Programming Java Android Development Project
 * Programming Java is
 *
 *      http://java-lang-programming.com/
 *
 * Model Generator version : 1.0.4
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.java_lang_programming.android_sqlite_demo.model;

import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;

/**
 * An Model class for Dau
 */
+public class Dau implements Parcelable {

    public static final String TAG = "Dau";
    // table name
    public static final String TABLE_NAME = "Dau";
    // table name aliases
    public static final String TABLE_NAME_OMISSION = "D";
    // カラム配列
    public static final String [] COL = new String [] {"id","dau_date","opening_price","high_price","low_price","closing_price","change_price","deleted_at","created_at","updated_at"};

    // id
    public String id;
    // dau_date
    public String dau_date;
    // opening_price
    public String opening_price;
    // high_price
    public String high_price;
    // low_price
    public String low_price;
    // closing_price
    public String closing_price;
    // change_price
    public String change_price;
    // deleted_at
    public String deleted_at;
    // created_at
    public String created_at;
    // updated_at
    public String updated_at;

+   public static final Parcelable.Creator<Dau> CREATOR
            = new Parcelable.Creator<Dau>() {
        public Dau createFromParcel(Parcel in) {
            return new Dau(in);
        }

        public Dau[] newArray(int size) {
            return new Dau[size];
        }
    };

    private Dau(Parcel in) {
        id = in.readString();
        dau_date = in.readString();
        opening_price = in.readString();
        high_price = in.readString();
        low_price = in.readString();
        closing_price = in.readString();
        change_price = in.readString();
        deleted_at = in.readString();
        created_at = in.readString();
        updated_at = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(id);
        out.writeString(dau_date);
        out.writeString(opening_price);
        out.writeString(high_price);
        out.writeString(low_price);
        out.writeString(closing_price);
        out.writeString(change_price);
        out.writeString(deleted_at);
        out.writeString(created_at);
        out.writeString(updated_at);
    }

    @Override
    public String toString() {
        StringBuffer str = new StringBuffer();
        str.append("Dau [");
        if (!TextUtils.isEmpty(id)) {
            str.append(" id=" + id);
        }
        if (!TextUtils.isEmpty(dau_date)) {
            str.append(", dau_date=" + dau_date);
        }
        if (!TextUtils.isEmpty(opening_price)) {
            str.append(", opening_price=" + opening_price);
        }
        if (!TextUtils.isEmpty(high_price)) {
            str.append(", high_price=" + high_price);
        }
        if (!TextUtils.isEmpty(low_price)) {
            str.append(", low_price=" + low_price);
        }
        if (!TextUtils.isEmpty(closing_price)) {
            str.append(", closing_price=" + closing_price);
        }
        if (!TextUtils.isEmpty(change_price)) {
            str.append(", change_price=" + change_price);
        }
        if (!TextUtils.isEmpty(deleted_at)) {
            str.append(", deleted_at=" + deleted_at);
        }
        if (!TextUtils.isEmpty(created_at)) {
            str.append(", created_at=" + created_at);
        }
        if (!TextUtils.isEmpty(updated_at)) {
            str.append(", updated_at=" + updated_at);
        }
        str.append("]");
        return str.toString();
    }
}
        

Parcelableをimplementsし、必要なメソッドを追加することで、データの受け渡しが可能になります。

■ 実装の解説

1. implements Parcelable

Parcelableインンターフェースを実装します。
describeContentsメソッドとwriteToParcelメソッドをオーバーライドする必要があります。

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel out, int flags) {
    out.writeString(id);
    out.writeString(dau_date);
    out.writeString(opening_price);
    out.writeString(high_price);
    out.writeString(low_price);
    out.writeString(closing_price);
    out.writeString(change_price);
    out.writeString(deleted_at);
    out.writeString(created_at);
    out.writeString(updated_at);
}
        

2. new Parcelable.Creator

Parcelからデータを書き/読みするための処理です。
Android Studio では自動で作成されないので、自分で実装する必要があります。

public static final Parcelable.Creator<Dau> CREATOR
        = new Parcelable.Creator<Dau>() {
    public Dau createFromParcel(Parcel in) {
        return new Dau(in);
    }

    public Dau[] newArray(int size) {
        return new Dau[size];
    }
};
        

* 上記のサンプルコードは、当サイトのサービス機能  Model Generator で作成しています。

Model Generator

パラメーター取得

putExtraメソッドで設定したパラメーターは、ActivityやFragmentで取得できます。

{project_folder}/ui/SampleDetailActivity.java
Item item = getIntent().getParcelableExtra("object");
        

Parcelableを使うことで、画面間でオブジェクトを渡すことができます。
なので、IDからオブジェクトを取得する無駄な処理を無くすことができます。

まとめ

WEBの開発に慣れていると、パラメーターにIDを渡して、画面遷移先でAPIからデータを取得するという処理にしてしまいがちです。
WEB開発のパターンを、そのままAndroid開発で適用しないよう、きっちりと学習しましょう。

当サイトのサービスも利用してみてください。

Model Generator

関連記事

タグ検索で調べてみよう

Android6.0