Android 系列 4.5从子活动检索数据返回主要活动

本文介绍如何在Android应用中实现从子活动向主活动传递数据的方法,包括使用startActivityForResult(), onActivityResult()和setResult()等关键函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.5从子活动检索数据返回主要活动


问题
您的主要活动需要从另一个活动检索数据,有时非正式地称为“子活动”。

在主活动中使用startActivityForResult(),onActivityResult(),在子活动中使用setResult()。
讨论
在这个例子中,我们从子活动(MySubActivity)返回一个字符串回主活动(MyMainActivity)。第一步是通过Intent机制“推”来自MyMainActivity的数据(见例4-8)。
实施例4-8。来自活动的推送数据
public class MyMainActivity extends Activity
{
//..for logging..
private static final String TAG = "MainActivity";
//..The request code is supposed to be unique...
public static final int MY_REQUEST_CODE = 123;
@Override
public void onCreate( Bundle savedInstanceState ) {
...
}
private void pushFxn() {
Intent intent =
new Intent(
this,
MySubActivity.class );
startActivityForResult( intent, MY_REQUEST_CODE );
}
protected void onActivityResult(
int requestCode,
int resultCode,
Intent pData) {
if ( requestCode == MY_REQUEST_CODE ) {
if (resultCode == Activity.RESULT_OK ) {
final String zData = pData.getExtras().getString
( MySubActivity.EXTRA_STRING_NAME );
//..do something with our retrieved value..
Log.v( TAG, "Retrieved Value zData is "+zData );
//..logcats "Retrieved Value zData is returnValueAsString"
}
}
}
}



将有一个带有调用pushFxn()方法的事件监听器的按钮;这将启动子活动。在示例4-8中,发生以下情况:
•主要活动的onActivityResult()在MySubActivity之后调用。 finish()。
•检索到的值在技术上是一个Intent,因此我们可以将其用于更复杂的数据(例如,Google联系人的URI)。但是,在例4-8中,我们只对Intent.getExtras()的字符串值感兴趣。
•requestCode(MY_REQUEST_CODE)应该是唯一的,用于区分多个未完成的子活动调用。
第二个主要步骤是将数据从MySubActivity“拉回”到MyMainActivity(参见示例4-9)。

实例4-9。从子活动的拉数据

public class MySubActivity extends Activity
{
public static final String EXTRA_STRING_NAME = "extraStringName";
@Override
public void onCreate( Bundle savedInstanceState ) {
...
}
private void returnValuesFxn() {
Intent iData = new Intent();
iData.putExtra(
EXTRA_STRING_NAME,
"returnValueAsString" );
setResult(
android.app.Activity.RESULT_OK,
iData );
//..returns us to the parent "MyMainActivity"..
finish();
}
}

同样,MySubActivity中的东西将调用示例4-9中的returnValuesFxn()方法。请注意以下事项:
•再一次,Intent用作数据(即iData)。
•setResult()需要一个结果代码,例如RESULT_OK。
•finish()基本上推送来自setResult()的结果。
•来自MySubActivity的数据不会被“拉”,直到我们回到MyMainActivity的另一边,因此可以说它更像一个第二个“push”。
•我们不必为我们的“额外”字段名使用一个public static final String变量,但我选择这样做,因为我认为这是一个好的风格。
用例(非正式)
在我的应用程序中,我有一个ListActivity与ContextMenu(用户长按一个选择来做某事),我想让MainActivity知道用户为ContextMenu操作选择了哪一行(我的应用程序只有一个操作) 。我最终使用意向额外将选定行的索引作为字符串传递回父活动;从那里我可以只是将索引转换回一个int,并使用它通过ArrayList.get(index)来标识用户行选择。这对我有用。然而,我相信有另一个/更好的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值