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(); } }
これで選択したツイートがポップアップで表示される
終わり