Activity間の値の受け渡しでは、Intentに値を渡してやって、呼び出し先のActivityからIntentの値をとってやるってなやりかたがあるんですが、面倒くさいです!ちょっとした値の受け渡しならいいんですけどね。どーすればいいのかと考えたところ、こんなやりかたがあるのかと・・・。シングルトンとか呼ばれるやつなのかな・・・?
たとえば、Activity Aで、こんな感じで値を渡してやれば、
Activity Bでは、こんな感じで値を取れます。
まず、Activity AでgetInstanceを呼び出したときには、_instanceは生成されていないので、新しく作られます。で、その_instance内に値を渡してます。次に、Activity BでgetInstance()で呼び出した_instanceは、ActivityAで作成した_instanceが残っているので、Ativity Aの_instanceと同じものです。
細かく言うと、A->B->Aって戻った場合は、最初のAで作成したDataHolderが残ってるので、値を初期値にするようなメソッドが必要な場合もあるのかと・・・。まぁ、しらね。
で、ここまでは、普通に思いついたんですけど、いろいろみているとなにやらApplicationなるクラスが用意されている模様です。このクラスを拡張したほうが、もっと永続的にデータが保持されるぜwwwwってコメントを見かけたんですけど、真偽不明。Android DevelopersのReferenceには、Applicationのクラスは、ほぼ使う必要ねーよって書かれてるし・・・。アプリのContextが取れるのがいいのかな・・・?
ほぼ一緒。違いは、Applicationをextendsしてるだけです。
あと、manifest.xmlのapplicationのnameをクラス名にしてやる必要があるみたい。
解決策 値を保持するstaticなクラスを作る
値を保持するクラスを作ってやればいいのかと。DataHolderのインスタンスはひとつだけ作成するようにして、常にDataHolder.getInstance()から呼び出すようにすれば、データはひとつのインスタンス内に保持されます。たぶんきっとこんな感じ。public class DataHolder{
static DataHolder _instance = null;
/**
* 常にこのメソッドから呼び出すようにする
*
*
* @return
*/
static public DataHolder getInstance(){
if(_instance==null){
_instance = new DataHolder();
}
return _instance;
}
String test ="AAAAAAAAAAAAAAAAAAAA";
public String getTestString(){
return test;
}
public void setTestString(String txt){
this.test = txt;
}
} たとえば、Activity Aで、こんな感じで値を渡してやれば、
DataHolder holder = DataHolder.getInstance();
holder.setTestString("Passed String on Activity A!");
Activity Bでは、こんな感じで値を取れます。
DataHolder holder = DataHolder.getInstance(); holder.getTestString();
まず、Activity AでgetInstanceを呼び出したときには、_instanceは生成されていないので、新しく作られます。で、その_instance内に値を渡してます。次に、Activity BでgetInstance()で呼び出した_instanceは、ActivityAで作成した_instanceが残っているので、Ativity Aの_instanceと同じものです。
細かく言うと、A->B->Aって戻った場合は、最初のAで作成したDataHolderが残ってるので、値を初期値にするようなメソッドが必要な場合もあるのかと・・・。まぁ、しらね。
で、ここまでは、普通に思いついたんですけど、いろいろみているとなにやらApplicationなるクラスが用意されている模様です。このクラスを拡張したほうが、もっと永続的にデータが保持されるぜwwwwってコメントを見かけたんですけど、真偽不明。Android DevelopersのReferenceには、Applicationのクラスは、ほぼ使う必要ねーよって書かれてるし・・・。アプリのContextが取れるのがいいのかな・・・?
Applicationを拡張して、値を保持するクラスを作る
ほぼ一緒。違いは、Applicationをextendsしてるだけです。
public class DataHolder extends Application{
static DataHolder _instance = null;
/**
* 常にこのメソッドから呼び出すようにする
*
*
* @return
*/
static public DataHolder getInstance(){
if(_instance==null){
_instance = new DataHolder();
}
return _instance;
}
String test ="AAAAAAAAAAAAAAAAAAAA";
public String getTestString(){
return test;
}
public void setTestString(String txt){
this.test = txt;
}
}あと、manifest.xmlのapplicationのnameをクラス名にしてやる必要があるみたい。
<application
android:name=".DataHolder" >