概述:java
若是启动另外一个Activity,而且但愿返回结果给当前的Activity,那么可以使用startActivityForResult()方法,在这种状况下,也是经过Bundle来进行数据交换的。android
为了获取到被启动的Activity,当前的Activity要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法,其中参数1表明请求码,参数2表明返回的结果码,由开发者根据业务须要自定义。app
一个Activity中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不一样的Activity处理不一样的业务。当这些新的Activity关闭后,系统都会回调前面那个Activity的onActivityResult()方法。为了知道该方法是由哪一个请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自于哪一个新的Activity,可利用resultCode结果码。ide
1、项目实例:this
在第二个Activity里让用户选择所在地,并将选择的结果返回给第一个Activityspa
完整代码:code
ForResultActivity.javaxml
package com.xsjayz.ac; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class ForResultActivity extends Activity { private Button button; private EditText cityEdit; @Override public void 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(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ForResultActivity.this, SecondActivity.class); // 启动对应的Activity,并等待返回的结果,其中0为请求码(requestCode),用于标识该请求。 startActivityForResult(intent, 0); } }); } /** * 重写onActivityResult()方法:以回调的方式来获取指定Activity返回的结果。 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { // 当requestCode和resultCode都为0时(处理特定的结果)。 if (requestCode == 0 && resultCode == 0) { Bundle bundleData = intent.getExtras(); String resultCity = bundleData.getString("city"); cityEdit.setText(resultCity); } } }
SecondActivity.java对象
package com.xsjayz.ac; import android.app.ExpandableListActivity; import android.content.Intent; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class SecondActivity extends ExpandableListActivity { private String[] provinces = new String[] { "上海", "江西", "浙江" }; private String[][] cities = new String[][] { { "徐汇", "黄浦", "浦东" }, { "上饶", "萍乡", "南昌" }, { "嘉兴", "绍兴", "杭州" } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** * ExpandableListAdapter */ ExpandableListAdapter adapter = new BaseExpandableListAdapter() { @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public boolean hasStableIds() { return true; } // 该方法决定每一个组选项的外观 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { LinearLayout linearLayout = new LinearLayout(SecondActivity.this); linearLayout.setOrientation(0); ImageView logo = new ImageView(SecondActivity.this); linearLayout.addView(logo); TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); linearLayout.addView(textView); return linearLayout; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public int getGroupCount() { return provinces.length; } // 获取指定组位置处的组数据 @Override public Object getGroup(int groupPosition) { return provinces[groupPosition]; } @Override public int getChildrenCount(int groupPosition) { return cities[groupPosition].length; } // 该方法决定每一个子选项的外观 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } // 获取指定组位置、指定子列表项处的子列表项数据 @Override public Object getChild(int groupPosition, int childPosition) { return cities[groupPosition][childPosition]; } private TextView getTextView() { AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 64); TextView textView = new TextView(SecondActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(60, 0, 0, 0); textView.setTextSize(20); return textView; } }; // 设置该窗口显示列表 setListAdapter(adapter); getExpandableListView().setOnChildClickListener( new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // 获取启动该Activity的上一个Activity对应的Intent Intent intent = getIntent(); Bundle data = new Bundle(); data.putString("city", cities[groupPosition][childPosition]); intent.putExtras(data); // 设置SecondActivity的结果码(resultCode),并设置在当前结束后退回去的Activity setResult(0, intent); finish(); return false; } }); } }
main.xmlutf-8
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: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>
2、问题
今天在写这段代码的时候,遇到一个纳闷的问题:
一、从A跳转到B
// 从AActivity跳转到BActivity,并传递参数过去 Intent intent = new Intent(AActivity.this,BActivity.class); intent.putExtra("path", filterImgPath); startActivityForResult(intent,REQUEST_CODE_GETIMAGE_FILTER);
二、在B处接收从A传递的数据,没有问题
getIntent().getStringExtra("path");
三、在B处理完成后,返回到A的过程,触发A的onActivityResult()方法
// 完成 doneButton.setOnClickListener(new View.OnClickListener() { @Override public void 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(); } });
四、在A处的onActivityResult()里
else if (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"); }
五、问题应该处在3,即3里面采用new一个Bundle对象来传递数据,这个Bundle应该没有和Intent对象关联,致使的结果就是在4里得到的Bundle对象不是3里的Bundle对象。