1つのアクティビティから前のアクティビティに値を渡す方法


97

1つの画面から前の画面に値を渡すにはどうすればよいですか?

このケースを考えてみます。私には2つのアクティビティがあります。最初の画面には1つとTextViewボタンがあり、2番目のアクティビティには1つとEditTextボタンがあります。

最初のボタンをクリックすると、2番目のアクティビティに移動する必要があり、ここでユーザーはテキストボックスに何かを入力する必要があります。2番目の画面からボタンを押すと、テキストボックスの値が最初のアクティビティに移動し、最初のアクティビティに表示されTextViewます。



回答:


240

あるアクティビティで実行されたアクションを別のアクティビティ内でキャプチャするには、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して、テキストエントリアクティビティからのコールバックをリッスンします。返されたインテントからエクストラを取得して、表示するテキスト値を取得します。

@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; 
    } 
  } 
} 

27
これnew Intent(null);は「あいまいすぎ」であったことを除いてすべてうまくいきましたnew Intent();
Richard Tingle 14

1
また、これは同じコンテキスト内でのみ機能することにも注意してください。たとえば、フラグメントからアクティビティを開始した場合、requestCodeは毎回異なるため、機能しません。フラグメントではgetActivity()。startActivityForResult()を使用する必要があります。
stef

10

他のクラスやアクティビティの変数やオブジェクトにアクセスする方法はいくつかあります。

A.データベース

B.共有設定。

C.オブジェクトのシリアル化。

D.共通データを保持できるクラスは、それが依存するCommon Utilitiesとして名前を付けることができます。

E.インテントとParcelableインターフェイスを介してデータを渡す。

プロジェクトのニーズによって異なります。

A. データベース

SQLiteは、Androidに組み込まれているオープンソースデータベースです。SQLiteは、SQL構文、トランザクション、準備済みステートメントなどの標準のリレーショナルデータベース機能をサポートしています。

チュートリアル-http ://www.vogella.com/articles/AndroidSQLite/article.html

B. 共有設定

ユーザー名を保存したいとします。したがって、キーユーザー名と値の値の2つが存在することになります。

収納方法

 // 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を使用してフィールドに格納し、そのためにゲッターとセッターを使用する

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. インテントを介したデータの受け渡し

データを渡すこのオプションについては、このチュートリアルを参照してください。

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


6

する必要はありません...

2番目のアクティビティからnewIntent()を呼び出すだけです

Intent retData=new Intent();

戻すデータを追加する

putExtras (retData.putExtra("userName", getUsrName()));

setResultを先に進めます

setResult(RESULT_OK, retData);

そして終了することができます

finish();


2

静的変数を設定するには、静的セッターメソッドを使用して呼び出しアクティビティで静的変数を使用することがよくあります。

このようにして、さまざまなアクティビティ間の制御の正確なフローに関係なく、任意のアクティビティの値を自由に変更できます。

このトリックは、アプリケーション内の同じアクティビティ(クラス)の複数のコピーのインスタンス化を気にしない場合にのみ使用できることに注意してください。ただし、これが最も簡単に実装できることがわかりました。 。


素晴らしいソリューションではありません。これはAndroidのベストプラクティスに反しています。アクティビティが強制終了されず、新しいインスタンスがシステムによって開始されることは保証できません。
SIr Codealot、2015年

0

ここで行う最善の方法は、スコープ外で定義されている共通クラスに変数を配置することです

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);
....
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.