1つの画面から前の画面に値を渡すにはどうすればよいですか?
この場合を考えてみましょう。私には2つのアクティビティがあります。最初の画面には1つのTextView
とボタンがあり、2番目のアクティビティには1つのEditText
とボタンがあります。
最初のボタンをクリックすると、2番目のアクティビティに移動する必要があり、ユーザーはテキストボックスに何かを入力する必要があります。 2番目の画面でボタンを押すと、テキストボックスの値が最初のアクティビティに移動し、最初のアクティビティTextView
に表示されます。
あるアクティビティで実行されたアクションを別のアクティビティ内でキャプチャするには、3つのステップが必要です。
メインアクティビティのstartActivityForResult
を使用して、サブアクティビティとしてセカンダリアクティビティ(「テキストの編集」アクティビティ)を起動します。
Intent i = new Intent(this,TextEntryActivity.class);
startActivityForResult(i, STATIC_INTEGER_VALUE);
サブアクティビティ内で、ユーザーがボタンをクリックしたときにアクティビティを閉じるのではなく、新しいインテントを作成し、入力したテキスト値をその追加バンドルに含める必要があります。親に渡すには、setResult
を呼び出してセカンダリアクティビティを閉じる前に、finish
を呼び出します。
Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();
最後のステップは、アクティビティの呼び出し:onActivityResult
をオーバーライドして、テキストエントリアクティビティからのコールバックをリッスンします。返されるIntentから余分なものを取得して、表示するテキスト値を取得します。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (STATIC_INTEGER_VALUE) : {
if (resultCode == Activity.RESULT_OK) {
String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
// TODO Update your TextView.
}
break;
}
}
}
他のクラスまたはアクティビティの変数またはオブジェクトにアクセスするには、いくつかの方法があります。
A.データベース
B.共有設定。
C.オブジェクトのシリアル化。
D.共通データを保持できるクラスは、依存する共通ユーティリティとして名前を付けることができます。
E. IntentsおよびParcelable Interfaceを介したデータの受け渡し。
プロジェクトのニーズに依存します。
A.データベース
SQLiteは、Androidに組み込まれているオープンソースデータベースです。 SQLiteは、SQL構文、トランザクション、準備済みステートメントなどの標準のリレーショナルデータベース機能をサポートしています。
チュートリアル- http://www.vogella.com/articles/AndroidSQLite/article.html
B.共有設定
ユーザー名を保存するとします。したがって、2つのことがありますKeyユーザー名、ValueValue。
保存方法
// Create object of SharedPreferences.
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
//now get Editor
SharedPreferences.Editor editor = sharedPref.edit();
//put your value
editor.putString("userName", "stackoverlow");
//commits your edits
editor.commit();
putString()、putBoolean()、putInt()、putFloat()、putLong()を使用すると、目的のdtatypeを保存できます。
フェッチ方法
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");
http://developer.Android.com/reference/Android/content/SharedPreferences.html
C.オブジェクトのシリアル化
オブジェクトの状態を保存してネットワーク経由で送信する場合、または目的に使用する場合は、オブジェクトのセル化が使用されます。
Java Beanを使用し、そのフィールドの1つとして格納し、そのためにgetterおよびsetterを使用します
JavaBeansはJavaプロパティを持つクラスです。プロパティはプライベートインスタンス変数と考えてください。プライベートなので、クラスの外部からアクセスできる唯一の方法はクラスのメソッドを使用することです。プロパティの値を変更するメソッドはセッターメソッドと呼ばれ、プロパティの値を取得するメソッドはゲッターメソッドと呼ばれます。
public class VariableStorage implements Serializable {
private String inString ;
public String getInString() {
return inString;
}
public void setInString(String inString) {
this.inString = inString;
}
}
を使用して、メールメソッドで変数を設定します
VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);
次に、オブジェクトSerialzationを使用してこのオブジェクトをシリアル化し、他のクラスでこのオブジェクトを逆シリアル化します。
シリアル化では、オブジェクトは、オブジェクトのデータと、オブジェクトのタイプおよびオブジェクトに格納されているデータのタイプに関する情報を含む一連のバイトとして表すことができます。
シリアル化されたオブジェクトは、ファイルに書き込まれた後、ファイルから読み取り、逆シリアル化できます。つまり、オブジェクトとそのデータを表す型情報とバイトを使用して、メモリ内でオブジェクトを再作成できます。
このチュートリアルが必要な場合は、このリンクを参照してください
http://javawithswaranga.blogspot.in/2011/08/serialization-in-Java.html
D.CommonUtilities
プロジェクトで頻繁に必要となる共通データを含むことができる自分でクラスを作成できます。
サンプル
public class CommonUtilities {
public static String className = "CommonUtilities";
}
E.インテントを介したデータの受け渡し
データを渡すこのオプションについては、このチュートリアルを参照してください。
する必要はありません。
2番目のアクティビティからnewIntenet()を呼び出すだけです
Intent retData=new Intent();
データを追加して戻す
putExtras (retData.putExtra("userName", getUsrName()));
setResultに進みます
setResult(RESULT_OK, retData);
そして、終了することができます
finish();
startActivityForResult()
また、詳細については、SDKからのリンクをご覧ください。
http://developer.Android.com/guide/appendix/faq/commontasks.html#opennewscreen
「画面から結果を返す」というタイトルの部分までスクロールします
私はしばしば、静的なセッターメソッドを使用して、呼び出しアクティビティで静的変数を使用してそれらを設定します。
このようにして、さまざまなアクティビティ間の正確な制御フローに関係なく、アクティビティの値を自由に変更できます。
このトリックは、アプリケーション内の同じアクティビティ(クラス)の複数のコピーのインスタンス化を気にしない場合にのみ使用できることに注意してください。 。
ここで行う最善の方法は、スコープ外で定義されている共通クラスに変数を配置することです
public class Utils
{
public static String mPosition;
}
コード内(例:OnButtonClickなど)
Intent intent = new Intent(Intent.ACTION_PICK,
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);
のコード内
@Override public void onActivityResult(int requestCode、int resultCode、Intent data){if(requestCode == Keys.PICK_CONTACT){if(resultCode == Activity.RESULT_OK){Uri contactData = data.getData();
//you may use the variable here after intent result
LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....