概述:
如果启动另一个Activity,并且希望返回结果给当前的Activity,那么可使用startActivityForResult()方法,在这种情况下,也是通过Bundle来进行数据交换的。
为了获取到被启动的Activity,当前的Activity要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法,其中参数1代表请求码,参数2代表返回的结果码,由开发者根据业务需要自定义。
一个Activity中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不同的Activity处理不同的业务。当这些新的Activity关闭后,系统都会回调前面那个Activity的onActivityResult()方法。为了知道该方法是由哪个请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自于哪个新的Activity,可利用resultCode结果码。
一、项目实例:
在第二个Activity里让用户选择所在地,并将选择的结果返回给第一个Activity
完整代码:
ForResultActivity.java
packagecom.xsjayz.ac;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
publicclass ForResultActivity extendsActivity {
privateButton button;
privateEditText cityEdit;
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.btn);
cityEdit = (EditText) findViewById(R.id.city_edit);
button.setOnClickListener(newOnClickListener() {
@Override
publicvoid onClick(View v) {
Intent intent = newIntent(ForResultActivity.this,
SecondActivity.class);
// 启动对应的Activity,并等待返回的结果,其中0为请求码(requestCode),用于标识该请求。
startActivityForResult(intent,0);
}
});
}
/**
* 重写onActivityResult()方法:以回调的方式来获取指定Activity返回的结果。
*/
@Override
protectedvoid onActivityResult(intrequestCode, intresultCode,
Intent intent) {
// 当requestCode和resultCode都为0时(处理特定的结果)。
if(requestCode == 0&& resultCode == 0) {
Bundle bundleData = intent.getExtras();
String resultCity = bundleData.getString("city");
cityEdit.setText(resultCity);
}
}
}
SecondActivity.java
packagecom.xsjayz.ac;
importandroid.app.ExpandableListActivity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.AbsListView;
importandroid.widget.BaseExpandableListAdapter;
importandroid.widget.ExpandableListAdapter;
importandroid.widget.ExpandableListView;
importandroid.widget.ExpandableListView.OnChildClickListener;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.TextView;
publicclass SecondActivity extendsExpandableListActivity {
privateString[] provinces = newString[] { "上海","江西","浙江"};
privateString[][] cities = newString[][] { { "徐汇","黄浦","浦东"},
{"上饶","萍乡","南昌"}, { "嘉兴","绍兴","杭州"} };
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* ExpandableListAdapter
*/
ExpandableListAdapter adapter = newBaseExpandableListAdapter() {
@Override
publicboolean isChildSelectable(intgroupPosition,
intchildPosition) {
returntrue;
}
@Override
publicboolean hasStableIds() {
returntrue;
}
// 该方法决定每个组选项的外观
@Override
publicView getGroupView(intgroupPosition, booleanisExpanded,
View convertView, ViewGroup parent) {
LinearLayout linearLayout = newLinearLayout(
SecondActivity.this);
linearLayout.setOrientation(0);
ImageView logo = newImageView(SecondActivity.this);
linearLayout.addView(logo);
TextView textView = getTextView();
textView.setText(getGroup(groupPosition).toString());
linearLayout.addView(textView);
returnlinearLayout;
}
@Override
publiclong getGroupId(intgroupPosition) {
returngroupPosition;
}
@Override
publicint getGroupCount() {
returnprovinces.length;
}
// 获取指定组位置处的组数据
@Override
publicObject getGroup(intgroupPosition) {
returnprovinces[groupPosition];
}
@Override
publicint getChildrenCount(intgroupPosition) {
returncities[groupPosition].length;
}
// 该方法决定每个子选项的外观
@Override
publicView getChildView(intgroupPosition, intchildPosition,
booleanisLastChild, View convertView, ViewGroup parent) {
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition)
.toString());
returntextView;
}
@Override
publiclong getChildId(intgroupPosition, intchildPosition) {
returnchildPosition;
}
// 获取指定组位置、指定子列表项处的子列表项数据
@Override
publicObject getChild(intgroupPosition, intchildPosition) {
returncities[groupPosition][childPosition];
}
privateTextView getTextView() {
AbsListView.LayoutParams lp = newAbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,64);
TextView textView = newTextView(SecondActivity.this);
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(60,0,0,0);
textView.setTextSize(20);
returntextView;
}
};
// 设置该窗口显示列表
setListAdapter(adapter);
getExpandableListView().setOnChildClickListener(
newOnChildClickListener() {
@Override
publicboolean onChildClick(ExpandableListView parent,
View v, intgroupPosition, intchildPosition,
longid) {
// 获取启动该Activity的上一个Activity对应的Intent
Intent intent = getIntent();
Bundle data = newBundle();
data.putString("city",
cities[groupPosition][childPosition]);
intent.putExtras(data);
// 设置SecondActivity的结果码(resultCode),并设置在当前结束后退回去的Activity
SecondActivity.this.setResult(0, intent);
SecondActivity.this.finish();
returnfalse;
}
});
}
}
main.xml
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/set_city_btn"/>
<EditText
android:id="@+id/city_edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
android:hint="@string/city_edit"/>
</LinearLayout>
二、问题
今天在写这段代码的时候,遇到一个纳闷的问题:
1、从A跳转到B
// 从AActivity跳转到BActivity,并传递参数过去
Intent intent = newIntent(AActivity.this,BActivity.class);
intent.putExtra("path", filterImgPath);
startActivityForResult(intent,REQUEST_CODE_GETIMAGE_FILTER);
2、在B处接收从A传递的数据,没有问题
getIntent().getStringExtra(
"path"
);
3、在B处理完成后,返回到A的过程,触发A的onActivityResult()方法
// 完成
doneButton.setOnClickListener(newView.OnClickListener() {
@Override
publicvoid onClick(View v) {
Intent intent = getIntent();
// 情形1
// Bundle bundle = new Bundle();
// bundle.putString("filterPath", mNewPath);
// 情形2
intent.putExtra("filterPath", mNewPath);
ImageFilterActivity.this.setResult(RESULT_OK, intent);
ImageFilterActivity.this.finish();
}
});
4、在A处的onActivityResult()里
elseif (requestCode == REQUEST_CODE_GETIMAGE_FILTER) {
// 情形1,获得的bundle 不为null,但是newPath为null
// Bundle bundle = data.getExtras();
// String newPath = bundle.getString("filterPath");
// 情形2,newPath不为null
String newPath = data.getStringExtra("filterPath");
}
5、问题应该处在3,即3里面采用new一个Bundle对象来传递数据,这个Bundle应该没有和Intent对象关联,导致的结果就是在4里获得的Bundle对象不是3里的Bundle对象。
转载地址:http://my.oschina.net/xsjayz/blog/77049?fromerr=KfrLlQKA