当按下返回键时,如何从第二个活动将数据传递到第一个活动? - Android

212
我有两个活动,Activity1Activity2
Activity1中,我有一个Button和一个TextView。 当点击按钮时会启动Activity2
Activity2中,我有一个EditText
我想在从Activity2按下后退键返回Activity1时,在Activity1TextView中显示从EditText检索到的数据。
有人可以帮我编写代码使其工作吗?

2
阅读有关startActivityForResult的内容。 - Dmitry Zaytsev
2
https://dev59.com/I03Sa4cB1Zd3GeqPuVvH - Chris
@kumareloaded:你能在这里分享解决方案吗?目前我的国家无法使用Pastebin。 - user1903022
可能是重复的问题,参考如何将值从一个活动传递到上一个活动 - andeart
onActivityResult方法已经过时,请使用以下方法: https://dev59.com/aVIG5IYBdhLWcg3w2VQZ - Ehsan Taghavi
显示剩余3条评论
8个回答

377

使用startActivityForResult方法启动Activity2,并使用setResult方法将数据从Activity2发送回Activity1。在Activity1中,您需要重写onActivityResult方法,以使用从Activity2传递回来的EditText数据更新TextView

例如:

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:如果你给我两个类的代码链接,以及你尝试过的代码(使用 http://pastebin.com/),我会帮你修改代码。 - ρяσѕρєя K
1
@kumareloaded:现在使用这个代码,它就可以工作了。 - ρяσѕρєя K
1
@ρяσѕρєяK:你能否在回答中使用SharedPref分享上述场景的代码?Pastebin在许多国家无法打开。在这里分享将非常有帮助,谢谢。 - user1903022
显示剩余5条评论

33

Activity1 应该使用 startActivityForResult() 方法来启动 Activity2

Activity2 应该使用 setResult() 方法将数据返回给 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);
        }
    }
}

1
@Swayam,我猜是因为你没有提到activity1应该使用startactivityforresult启动activity2。 - LutfiTekin
1
@LutfiTekin:很有可能是这样!感谢您指出来!我已经编辑了我的回答。 :) - Swayam

23

当我在onBackPressed中使用setResult时,其他答案都无效。注释掉调用超类的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;
        }
    }
}

好的,onBackPressed() 方法被重写了,所以返回功能不起作用。你需要手动调用 finish() - Gaurav Mall

7

这是一个替代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的示例在这里是一个有用的解决方法。 - OhNoNotScott
对我来说,那是一个糟糕的选择。存在 actionForResult。 - marlonpya

3

2021年Java新版本更新:

在MainActivity中使用activityresultlauncher()代替startactivityforresult()。

ActivityResultLauncher<Intent> activityResultLaunch = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if (result.getResultCode() == 123) {
                    Intent data = result.getData();
                    String myStr = data.getStringExtra("MyData");

                    if (!TextUtils.isEmpty(myStr )) {
                        myTextView.setText(myStr);
                    }

                }
            }
        });

在onCreate()方法内:

myBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, Second.class);
            activityResultLaunch.launch(intent);
        }
    });

在SecondActivity中(onCreate外部):

@Override
public void onBackPressed() {
    String data = myEditText.getText().toString();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(123, intent);
    finish();
}

覆盖finish()函数如下:override fun finish() { setResult(RESULT_OK, Intent().apply { putExtra("Parameters", Gson().toJson(result)) }) super.finish() }我们可以通过覆盖finish()函数来设置活动结果。因此,即使用户离开活动而没有触摸返回按钮,此方法也会起作用... - E. Kolver
可以在Fragment中像这样使用吗?因为我正在从Fragment启动Intent到Activity,并尝试从Activity接收数据到Fragment。 - Ninja

3
这是你的第一个 Activity1。
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 类。

现在这是您的第二个活动,名称为 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);
}

}

现在当您完成第二个活动后,您需要在onBackPressed()或任何按钮点击事件中调用setResult()方法。然后当您的Activity2被销毁时,您的Activity1的回调函数onActivityResult()将会被调用。从那里,您可以从意图中获取数据。希望这能帮助到您... :)

2

我有一个问题,想在我创建的软按钮中使用发送数据类型,并且这个软件按键是每个Android设备上默认的。所以,我先在我的“A”Activity中创建了一个Intent

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

然后在我的第二个活动中,我在我的 "B" Activity 中声明了一个字段:

private static int resultCode = 40;

在我成功发出请求或者想要告诉"A" Activity任务已经完成时,将resultCode的值更改为我在"A" Activity中所说的相同值,对于我来说是"60",然后:

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

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

提示:如果您想使此功能正常工作,记得从onBackPressed方法中删除Super

然后我也应该在"A"活动中调用onActivityResult方法:

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

1

简而言之,请使用Activity.startActivityForResult

详细回答:

您应该首先阅读Android开发者文档。具体来说,您的问题涉及到Activity文档中Starting Activities and Getting Results部分的内容。

至于示例代码,Android SDK提供了很好的示例。此外,其他答案在这里给出了可用的简短代码片段。

然而,如果您正在寻找替代方案,请阅读this SO question。这是一个关于如何在片段中使用startActivityForResults以及在活动之间传递数据的几种方法的讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接