按下时如何将数据从第二活动传递到第一活动?-安卓


184

我有2个活动,Activity1Activity2

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

Activity2我有一个EditText

我想显示从检索到的数据的EditText活性2的TextView活性1当从压回活性2

有人可以通过代码帮助我完成这项工作吗?


2
阅读有关startActivityForResult
Dmitry Zaytsev


另一种方法:Activity2将值放入持久性存储中并Activity1从那里读取。
亨利

@kumareloaded:请在这里分享解决方案。截至目前,Pastebin不在我的国家/地区工作。
user1903022

Answers:


326

从开始Activity2,startActivityForResult并使用setResult将数据从Activity2发送回Activity1的方法。在Activity1中,您将需要重写onActivityResultTextView使用EditTextActivity2中的数据进行更新。

例如:

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


1
谢谢男人,如果可以的话,您可以帮我用类似的SharedPreferences编码部分来做同样的事情:)
kumareloaded 2013年

1
@kumareloaded:最欢迎的朋友。如果你想用做相同的SharedPreferences然后看看这个例子
ρяσѕρєяķ

2
@kumareloaded:如果你给我两个类的代码链接有什么ü已经尝试使用pastebin.com 的话,我会编辑代码
ρяσѕρєяķ

1
@kumareloaded:现在使用这个代码,这将工作
ρяσѕρєяķ

1
@ρяσsρєяK:您能否在答案中使用SharedPref共享上述方案的代码。Pastebin在许多国家/地区都不开放。在这里分享它会很有帮助,谢谢。
user1903022

26

活动1应该开始活性2startActivityForResult()

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

活动2中

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

@Swayam我猜是因为您没有提到activity1应该以startactivityforresult开始activity2。
LutfiTekin

1
@LutfiTekin:可能就是这样!感谢您指出!编辑了我的答案。:)
Swayam

17

当我把其他的答案没有工作setResultonBackPressed。评论对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的替代方法。但是请记住,在这种情况下,这种方法的性能可能会很昂贵,但在某些情况下可能需要使用。

在活动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");
} 

这不能用于对象(仅用于字符串,布尔值等)
FindOut_Quran 2015年

1
就我而言,我是从MainActivity中的一个列表项启动一个活动,并希望将用户创建的数据返回到该列表项。在这种情况下,当我使用mContext.startActivity()时,startActivityForResult()无法使用。@katmanco示例在这里是一个有用的解决方法。
故障

对我来说那是一次糟糕的选举。存在actionForResult
marlonpya

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。

现在这是您的第二个活动,名称是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(),您可以从intent中获取数据..

希望对您有帮助... :)



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

1

TL; DR使用 Activity.startActivityForResult

长答案:

您应该先阅读Android开发人员文档。具体来说,您问题的主题Starting Activities and Getting ResultsActivity文档介绍。

作为示例代码,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);

然后在第二个活动中,我在“ 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方法中删除该方法。

那么我也应该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;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.