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