202

我有 2 个活动,Activity1Activity2

Activity1我有一个ButtonTextView。单击按钮时,Activity2将启动。

Activity2我有一个EditText

当从Activity2按下返回时,我想在Activity1TextView中显示从Activity2中的EditText检索到的数据。

有人可以帮我编写代码来完成这项工作吗?

4

10 回答 10

362

启动 Activity2startActivityForResult并使用setResult将数据从 Activity2 发送回 Activity1 的方法。在 Activity1 中,您需要覆盖以使用 Activity2中的数据onActivityResult进行更新。TextViewEditText

例如:

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在活动之间共享数据。

于 2013-01-12T10:32:09.273 回答
29

Activity1应该以Activity2开头startActivityForResult()

Activity2应该setResult()用来将数据发送回Activity1

Activity2中,

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

活动1中,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}
于 2013-01-12T10:30:51.770 回答
21

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;
        }
    }
}
于 2015-11-05T03:19:54.897 回答
7

将此作为 startActivityforResult 的替代方法。但请记住,对于这种情况,这种方法在性能方面可能会很昂贵,但在某些情况下您可能需要使用。

在活动 2 中,

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

在活动 1 中,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 
于 2015-01-26T15:03:25.613 回答
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");
    }
}
}

从这里你开始你的 Activity2.class 使用startActivityForResult(mRequestCode, Activity2.class);

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

}

现在,当您完成第二个活动时,您可以从 onBackPress() 或任何按钮单击调用 setResult() 方法,当您的 Activity2 将销毁时,您的 Activity1 的回调方法onActivityResult()将从那里调用,您可以从意图中获取数据..

希望对你有帮助……:)

于 2013-01-12T10:50:23.233 回答
3

从您的 FirstActivity 调用 SecondActivity 使用 startActivityForResult() 方法。

例如:

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
        }
    }
}
于 2017-04-26T10:57:23.637 回答
2

阅读这些:

  1. 返回结果到 onActivityResult()
  2. 从被调用的活动中获取结果 - Android 初学者教程

这些文章将帮助您了解如何在 Android 中的两个活动之间传递数据。

于 2013-01-12T10:30:42.207 回答
2

我有一个问题,我想在我制作的软按钮和每个 Android 设备中的默认软键中发送数据类型,所以我已经这样做了,首先我Intent在我的“一个” Activity

            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”活动此工作已成功完成时,将 resultCode 的值更改为我在“A”Activity中所说的相同,在我的情况下为“60”和然后:

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

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

PS:Super如果您希望它正常工作,请记住从 onBackPressed 方法中删除。

那么我也应该在我的“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();
            }
        }
    }

就是这样,希望对你有所帮助。#快乐编码;

于 2018-07-16T10:35:23.010 回答
1

TL;DR 使用Activity.startActivityForResult

长答案:

您应该从阅读 Android 开发者文档开始。具体来说,您的问题主题在文档的Starting Activities and Getting Results部分中进行了Activity介绍。

至于示例代码,Android SDK 提供了很好的示例。此外,此处的其他答案为您提供了要使用的示例代码的简短片段。

但是,如果您正在寻找替代方案,请阅读此 SO question。这是一个关于如何使用startActivityForResults片段的很好的讨论,以及在活动之间传递数据的其他方法。

于 2013-01-12T10:34:17.017 回答
0

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();
}
于 2022-01-11T06:26:07.667 回答