別のActivityへの遷移時にクラスを渡す

androidでアプリを作成している時に、別のActivityにクラスを渡す処理を書いた時のメモ

普通に文字列を渡したいとき


//MainActivity.java
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("hoge", "テスト");
startActivity(intent);

//NextActivity.java
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContextView(~~~);
    String s = getIntent.getStringExtra("hoge");

こんな感じ

そしてクラスの渡し方 (今回はExampleObject という自作したクラスを使う)
まず、Serialize を使ったクラスを作成する。


// ExampleSerialize.java
public class ExampleSerialize implements Serializable {
    static ExampleObject exampleObject;
    public ExampleSerialize(ExampleObject exampleObject){
        this.exampleObject = exampleObject;
    }
    public ExampleObject getExampleObject(){
        return this.exampleObject;
    }
}

自作クラスを内部に持ち、コンストラクタとアクセサのみ実装する。

実際の遷移処理


//MainActivity.java

// 既にexampleObjectが作られていることとする

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("hoge", new ExapleSerialize(exampleObject)); // ExapleSerialize をセット
startActivity(intent);

//NextActivity.java
ExampleObject exampleObject;
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContextView(~~~);
    exampleObject = ((ExapleSerialize)getIntent().getSerializableExtra("hoge")).getExampleObject();

これでクラスごと受け渡せた
上記の例だと
ExampleObjectを抜き出した後そのままgetExampleObject関数を読んで取得している。
この処理は以下の処理と同じ


ExampleSerialize exampleSerialize = (ExapleSerialize)getIntent().getSerializeableExtra("hoge");
exampleObject = exampleSerialize.getExapmleObject();

追記:
Serializeの中の、格納変数をstaticにすることでどんなクラスも受け渡せます。

以上です!!

余談:
これを使えば、たとえばツイッタークライアントを作っていてリストにあるツイートを選択した時に、リプライ用Activityに飛ばしたい時などに使える。

(Twitter4Jを使ってます)
こんなSerializeを作って


//TweetSerialize.java
public class TweetSerialize implements Serializable {
    Status status;
    public TweetSerialize(Status status){
        this.status = status;
    }
    public Status getStatus(){
        return this.status;
    }
}

リストのアイテムをクリックしたときの遷移処理を書いて
(遷移策はTweetDetailActivity)
(リストのアイテムはStatusとする)


// MainActivity.java

// リストビューのアイテムをクリックした時だから OnItemClickListener
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // クリック場所からStatusを取得
        Status status = (Status)parent.getItemAtPosition(position);
        Intent intent = new Intent(MainActivity.this, TweetDetailActivity.class);
        intent.putExtra("tweet", new TweetSerialize(status));
        startActivity(intent);
    }
});

// TweetDetailActivity.java

public class TweetDetailActivity extends Activity {
    Status status;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_tweet_detail);
        status = ((TweetSerialize)getIntent().getSerializableExtra("tweet")).getStatus();
        Toast.makeText(this, status.getText(), Toast.LENGTH_SHORT).show();
    }
}

これで選択したツイートがポップアップで表示される

終わり

Atsumi3

したいことをします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください