我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。
现在我想把一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它会抛出一些运行时异常。
有什么解决办法吗?
我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。
现在我想把一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它会抛出一些运行时异常。
有什么解决办法吗?
当前回答
只是一个小细节,我认为是错过了以上的答案。
如果你的子活动可以从多个父活动中打开,那么你可以根据你的活动是由startActivity还是startActivityForResult打开来检查你是否需要做setResult。您可以通过使用getCallingActivity()来实现这一点。更多信息请点击这里。
其他回答
所有这些答案都是在解释你发送数据后需要完成的第二个活动的场景。
但如果你不想完成第二个活动,想把数据发送回第一个活动,你可以使用BroadCastReceiver。
〇第二次活动
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
〇第一次活动
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
在onCreate()-中注册接收者
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
在onDestroy()中取消注册
只是一个小细节,我认为是错过了以上的答案。
如果你的子活动可以从多个父活动中打开,那么你可以根据你的活动是由startActivity还是startActivityForResult打开来检查你是否需要做setResult。您可以通过使用getCallingActivity()来实现这一点。更多信息请点击这里。
使用startActivityForResult()方法调用子活动Intent
这里有一个例子: http://developer.android.com/training/notepad/notepad-ex2.html
在“从屏幕返回结果”中: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
FirstActivity使用startActivityForResult:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2)
{
String message=data.getStringExtra("MESSAGE");
}
}
在SecondActivity上调用setResult() onClick事件或onBackPressed()
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);
在第一个活动中,你可以使用startActivityForResult()发送意图,然后在它完成使用setResult后从第二个活动中获得结果。
MainActivity.class
public class MainActivity extends AppCompatActivity {
private static final int SECOND_ACTIVITY_RESULT_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
// send intent for result
startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
if (resultCode == RESULT_OK) {
// get String data from Intent
String returnString = data.getStringExtra("keyName");
// set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
SecondActivity.class
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}