押し戻されたときに2番目のアクティビティから1番目のアクティビティにデータを渡す方法は?-アンドロイド


186

Activity1Activity2の 2つのアクティビティがあります。

ではActivity1IましボタンのTextViewを。ボタンをクリックするとActivity2が起動します。

ではActivity2IきたのEditTextを

私はから取得したデータを表示したいのEditTextActivity2のTextViewActivity1をバックがから押されたときにActivity2

誰かがこれを機能させるためのコードを手伝ってくれる?


2
お読みくださいstartActivityForResult
ドミトリーザイツェフ2013年


別の方法:Activity2永続ストレージに値を入れ、Activity1そこから読み取ります。
Henry

@kumareloaded:ここで解決策を共有していただけませんか。Pastebinは私の国では今のところ機能していません。
user1903022 2015年

回答:


328

Activity2を開始し、Activity2 からActivity1にデータを送信startActivityForResultするためのsetResultメソッドを使用します。Activity1では、オーバーライドする必要がありますonActivityResult更新するためTextViewEditTextActivity2からのデータ。

例えば:

Activity1、としてActivity2を起動します。

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);

Activity2、使用setResultデータを送信するためには、バックアップ:

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

そしてActivity1で、次のようにデータを受信しますonActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

可能であれば、アクティビティ間でデータを共有するためにSharedPreferencesも使用します。


1
おかげで、できれば、SharedPreferencesの同様のコーディング部分で同じことを行うのを手伝ってください:)
kumareloaded

1
@kumareloaded:最も歓迎される友人。あなたが使用して同じことを行いたい場合はSharedPreferences、次に参照この例を
Kρяσѕρєя

2
@kumareloaded:あなたはuが使用しようとしているものと私は両方のクラスのコードへのリンクを与える場合pastebin.comを 、私はあなたのコードを編集します
Kρяσѕρєя

1
今使用します。@kumareloaded このコードは、これは動作します
Kρяσѕρєя

1
@ρяσѕρєяK:SharedPrefを使用して上記のシナリオのコードを共有してください。Pastebinは多くの国で開かれていません。ここでそれを共有することは大きな助けになります、ありがとう。
user1903022

27

Activity1は、起動する必要がありますActivity2をしてstartActivityForResult()

Activity2setResult()、データをActivity1に送り返すために使用する必要があります。

Activity2

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

Activity1

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

@Swayamアクティビティ1はstartactivityforresultでアクティビティ2を開始する必要があるとは言わなかったので、私は推測します。
LutfiTekin

1
@LutfiTekin:それで十分かもしれません!指摘してくれてありがとう!私の答えを編集しました。:)
Swayam

17

私が入れsetResultたとき、他の答えはうまくいきませんでしたonBackPressed。super onBackPressedへの呼び出しにコメントし、finish手動で呼び出すと問題が解決します。

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

そして最初の活動では:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}

6

これをstartActivityforResultの代わりとして使用します。ただし、このような場合、このアプローチはパフォーマンスの点で費用がかかる可能性がありますが、場合によっては使用する必要があります。

Activity2では、

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

Activity1で

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

これはオブジェクトには使用できません(文字列、ブール値などのみ)
FindOut_Quran '

1
私の場合、MainActivityのリストアイテムからアクティビティを起動していて、ユーザーが作成したデータをそのリストアイテムに戻したいと考えていました。mContext.startActivity()を使用していたこの場合、startActivityForResult()は利用できませんでした。ここでの@katmancoの例は、役立つ回避策でした。
2017

私にとってそれは悪い選挙です。存在するactionForResult
marlonpya

3

FirstActivityから、startActivityForResult()メソッドを使用してSecondActivityを呼び出します。

例えば:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

SecondActivityに、FirstActivityに戻したいデータを設定します。元に戻したくない場合は、何も設定しないでください。

例:データを送り返す場合は、secondActivityで:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

データを返したくない場合:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

次に、FirstActivityクラスに、onActivityResult()メソッドの次のコードを記述します。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}

2

これが最初のアクティビティです1。

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

ここから、startActivityForResult(mRequestCode、Activity2.class);を使用してActivity2.classを開始します

これが2番目のアクティビティです。名前はActivity2です。

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

次に、2番目のアクティビティを完了したら、onBackPress()またはボタンクリックからsetResult()メソッドを呼び出し、Activity2が破棄されると、Activity1のコールバックメソッドonActivityResult()がそこから呼び出され、インテントからデータを取得できます..

それがあなたに役立つことを願っています... :)



1

TL; DRの使用 Activity.startActivityForResult

長い答え:

まず、Android開発者向けドキュメントを読むことから始めます。具体的には、質問のトピックはドキュメントのStarting Activities and Getting Resultsセクションで説明されていActivityます。

コード例として、Android SDKは良い例を提供します。また、ここでの他の回答は、使用するサンプルコードの短いスニペットを提供します。

ただし、代替手段を探している場合は、このSOの質問を読んでください。これは、startActivityForResultsフラグメント間での使用方法や、アクティビティ間でデータを受け渡すためのいくつかのアプローチについての良い議論です。


0

私が作成したソフトボタンとすべてのAndroidデバイスのデフォルトであるsoftKeyでこの送信データタイプを実行したいという問題があるので、これを実行しました。最初にIntent、 「A」Activity

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

次に、2番目のアクティビティで、「B」のフィールドを宣言しましたActivity

private static int resultCode = 40;

次に、リクエストを成功させた後、または「A」アクティビティにこのジョブが正常に行われたことを伝えたい場合は、resultCodeの値を「A」Activityで言ったのと同じ値に変更します。次に:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS:Superこれを適切に機能させる場合は、onBackPressedメソッドからを削除することを忘れないでください。

次にonActivityResult、「A」アクティビティでもメソッドを呼び出す必要があります。

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

それで終わりです。お役に立てば幸いです。#HappyCoding;

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