Raj*_*ian 277 android android-intent
我有两个活动:主要活动和儿童活动.
当我按下主活动中的按钮时,将启动子活动.
现在我想将一些数据发送回主屏幕.我使用了Bundle类,但它不起作用.它会抛出一些运行时异常.
这有什么解决方案吗?
Ret*_*ier 454
根据具体情况,有两种方法可以实现您的目标.
最常见的情况(您的听起来就是这样)是使用子Activity来获取用户输入 - 例如从列表中选择联系人或在对话框中输入数据.在这种情况下,您应该使用startActivityForResult启动您的子Activity.
这提供了一个管道,用于使用数据将数据发送回主Activity setResult.setResult方法接受一个int结果值和一个传递回调用Activity的Intent.
Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
Run Code Online (Sandbox Code Playgroud)
在调用Activity覆盖中访问返回的数据onActivityResult.requestCode对应于startActivityForResult调用中传入的整数,而resultCode和数据Intent则从子Activity返回.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (MY_CHILD_ACTIVITY) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data returned from the child Activity.
String returnValue = data.getStringExtra("some_key");
}
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
jim*_*thy 176
活动1使用startActivityForResult:
startActivityForResult(ActivityTwo, ActivityTwoRequestCode);
Run Code Online (Sandbox Code Playgroud)
活动2已启动,您可以执行操作,关闭活动执行以下操作:
Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();
Run Code Online (Sandbox Code Playgroud)
活动1 - 从上一个活动返回将调用onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
num1 = data.getIntExtra(Number1Code);
num2 = data.getIntExtra(Number2Code);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:回答Seenu69的评论,在活动二中,
int result = Integer.parse(EditText1.getText().toString())
+ Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);
Run Code Online (Sandbox Code Playgroud)
然后在活动一,
int result = data.getExtra(KEY_RESULT);
Run Code Online (Sandbox Code Playgroud)
Sur*_*gch 62
它帮助我在上下文中看到事物.这是一个完整的简单项目,用于发回数据.这是一个图像,而不是提供xml布局文件.
startActivityForResult,为其提供任意结果代码.onActivityResult.当第二个活动完成时调用此方法.您可以通过检查请求代码来确保它实际上是第二个活动.(当您从同一主活动中启动多个不同的活动时,这非常有用.)Intent.使用键值对提取数据.MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final int SECOND_ACTIVITY_REQUEST_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);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_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_REQUEST_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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Intent.数据存储在Intent使用键值对中.RESULT_OK并添加保存数据的意图.finish()关闭第二个活动.SecondActivity.java
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();
}
}
Run Code Online (Sandbox Code Playgroud)
RESULT_OK.只需使用全名:Activity.RESULT_OK.小智 26
FirstActivity使用startActivityForResult:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2)
{
String message=data.getStringExtra("MESSAGE");
}
}
Run Code Online (Sandbox Code Playgroud)
在SecondActivity上调用setResult()onClick事件或onBackPressed()
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(2,intent);
Run Code Online (Sandbox Code Playgroud)
Int*_*ons 15
使用startActivityForResult()方法调用调用子活动Intent
这里有一个例子:http: //developer.android.com/training/notepad/notepad-ex2.html
并在"从屏幕返回结果"中:http: //developer.android.com/guide/faq/commontasks.html#opennewscreen
我已经创建了简单的演示类,以便您更好地参考.
FirstActivity.java
public class FirstActivity extends AppCompatActivity {
private static final String TAG = FirstActivity.class.getSimpleName();
private static final int REQUEST_CODE = 101;
private Button btnMoveToNextScreen;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(mIntent, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQUEST_CODE && data !=null) {
String strMessage = data.getStringExtra("keyName");
Log.i(TAG, "onActivityResult: message >>" + strMessage);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是SecondActivity.java
public class SecondActivity extends AppCompatActivity {
private static final String TAG = SecondActivity.class.getSimpleName();
private Button btnMoveToPrevious;
private EditText editText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
editText = (EditText) findViewById(R.id.editText);
btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getEditableText().toString();
Intent mIntent = new Intent();
mIntent.putExtra("keyName", message);
setResult(RESULT_OK, mIntent);
finish();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
2021 年 3 月更新
和Activity v1.2.0和Fragment v1.3.0 一样,新的Activity Result APIs已经被引入。
Activity Result API 提供了用于注册结果、启动结果以及在系统分派结果后处理结果的组件。
所以不再需要使用startActivityForResult和onActivityResult了。
为了使用新 API,您需要在源 Activity 中创建一个 ActivityResultLauncher,指定在目标 Activity 完成并返回所需数据时将运行的回调:
private val intentLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.getStringExtra("key1")
result.data?.getStringExtra("key2")
result.data?.getStringExtra("key3")
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在需要时启动您的意图:
intentLauncher.launch(Intent(this, YourActivity::class.java))
Run Code Online (Sandbox Code Playgroud)
要从目标 Activity 返回数据,您只需添加一个包含要返回到setResult()方法的值的意图:
val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")
setResult(Activity.RESULT_OK, data)
finish()
Run Code Online (Sandbox Code Playgroud)
有关任何其他信息,请参阅Android 文档
小智 5
在第一个活动中,您可以使用发送意图 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
所有这些答案都解释了发送数据后需要完成第二个活动的场景。
但如果您不想完成第二个活动并希望将数据发送回第一个活动,那么您可以使用 BroadCastReceiver。
在第二个活动中 -
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
在第一个活动中 -
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
Run Code Online (Sandbox Code Playgroud)
在 onCreate() 中注册接收器 -
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
Run Code Online (Sandbox Code Playgroud)
在 onDestroy() 中取消注册
| 归档时间: |
|
| 查看次数: |
267925 次 |
| 最近记录: |