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

How to pass data from 2nd activity to 1st activity when pressed back? - android

我有两个活动,活动1和活动2。

Activity1中,我有一个按钮和文本视图。单击按钮时,活动2启动。

Activity2中,我有一篇编辑文章。

我想在Activity1的文本视图中显示从Activity2的EditText中检索到的数据,当从Activity2按下Back时。

有人能帮我写代码吗?


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

例如:

在Activity1中,启动Activity2为:

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

在activity2中,使用setResult发送数据:

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

在活动1中,使用onActivityResult接收数据:

1
2
3
4
5
6
7
8
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");
         }    
    }
}

如果可以,还可以使用sharedreferences在活动之间共享数据。


活动1应使用startActivityForResult()启动活动2。

activity2应该使用setResult()将数据发送回activity1。

在Actuviy2中,

1
2
3
4
5
6
7
@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

在活动1中,

1
2
3
4
5
6
7
8
onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}


当我把setResult放在onBackPressed中时,其他的答案都不起作用。对super onBackPressed进行评论调用,手工调用finish解决了这个问题:

1
2
3
4
5
6
7
8
@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

在第一个活动中:

1
2
3
4
5
6
7
8
9
10
11
@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;
        }
    }
}

把它作为startActivityforResult的替代方法,但是要记住,在这种情况下,这种方法在性能方面可能很昂贵,但在某些情况下,您可能需要使用它。

在Actuviy2中,

1
2
3
4
5
6
7
8
@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

在活动1中,

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


从FirstActivity使用startActivityForResult()方法调用第二个Activity。

例如:

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

在第二个活动中,设置要返回到第一个活动的数据。如果你不想回来,就不要再做任何设置。

例如:在secondactivity中,如果要发送回数据:

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

如果不想返回数据:

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

现在,在FirstActivity类中,为OnActivityResult()方法编写以下代码。

1
2
3
4
5
6
7
8
9
10
11
@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
        }
    }
}

这是你的第一次活动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;

现在这是您的第二个活动,name是activity2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()方法,或者从任何按钮单击,当您的活动2将被破坏时,您的活动1的回调方法onactivityresult()将从那里调用,您可以从intent获取数据。

希望它能对你有所帮助……:)


阅读这些:

  • 将结果返回到OnActivityResult()。
  • 从名为"活动-Android初学者教程"中获取结果
  • 这些文章将帮助您理解如何在Android中的两个活动之间传递数据。


    我有一个问题,我想用我做的软按钮发送数据类型,软键是每个安卓设备的默认值,所以我做了这个,首先我在我的"a"Activity中做了一个Intent

    1
    2
    3
    4
    5
                Intent intent = new Intent();
                intent.setClass(context, _AddNewEmployee.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivityForResult(intent, 6969);
                setResult(60);

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

    1
    private static int resultCode = 40;

    然后,在我成功地提出请求后,或者每当我想告诉"A"活动这项工作已经成功完成时,将resultcode的值更改为我在"A"Activity中所说的值,在我的情况下是"60",然后:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       @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();
                }
            }
        }

    就这样,希望它能帮助你。快速编码;


    tl;dr使用Activity.startActivityForResult

    长回答:

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

    例如代码,android sdk提供了很好的例子。另外,这里的其他答案也提供了一些要使用的示例代码的简短片段。

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