如何在按下时将数据从第二个活动传递到第一个活动? - android

时间:2013-01-12 10:24:19

标签: android android-activity parent-child pass-data

我有2项活动,活动1 活动2

Activity1我有一个按钮 TextView 。 单击按钮时,活动2 将启动。

Activity2我有一个 EditText

我希望在活动1 文本视图中显示从 EditText 中检索到的数据从 Activity2 按下。

有人可以帮助我使用代码来完成这项工作吗?

9 个答案:

答案 0 :(得分:282)

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

例如:

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 :(得分:21)

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

答案 2 :(得分:16)

setResult放入onBackPressed时,其他答案无效。评论对超级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;
        }
    }
}

答案 3 :(得分:4)

将此作为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");
} 

答案 4 :(得分:2)

阅读以下内容:

  1. Return result to onActivityResult()
  2. Fetching Result from a called activity - Android Tutorial for Beginners
  3. 这些文章将帮助您了解如何在Android中的两个活动之间传递数据。

答案 5 :(得分:2)

这是你的第一个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.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);
}

}

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

希望它会对你有所帮助...... :)

答案 6 :(得分:2)

从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
        }
    }
}

答案 7 :(得分:0)

TL; DR使用Activity.startActivityForResult

答案很长:

您应该首先阅读Android开发人员文档。具体而言,您的问题主题将在Activity文档的Starting Activities and Getting Results部分中介绍。

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

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

答案 8 :(得分:0)

,我遇到一个问题,我想在我制作的“软按钮”中发送数据类型,并在每个Android设备中默认使用“ softKey”,所以首先要做的是我的“ A” 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:请记住,如果您希望其正常工作,请从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;