这个demo主要演示了如何从其它的activity中返回预期的结果。要实现这个功能,主要有三个步骤需要注意。
1.在主activity启动子activity时使用startActivityForResult()方法,而不是使用startActivity()方法。
2.使用了startActivityForResult()方法就必须重写onActivityResult(int requestCode, int resultCode, Intent data) 并在这个中实现对返回的结果的处理。
3.在子activity中使用setResult()方法设置返回的结果。
主布局文件activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Press the button to get an activity result which will be displayed here:" />
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="1"
android:background="#ff00ff88" />
<Button
android:onClick="click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Get Result"/>
</LinearLayout>
子布局文件send_result.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:padding="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Pick a result to send or BACK to cancel"/>
<Button
android:id="@+id/bt_corky"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal"
android:text="Corky"/>
<Button
android:id="@+id/bt_violet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal"
android:text="Violet"/>
</LinearLayout>
MainActivity类
public class MainActivity extends Activity {
private static final int GET_CODE = 0;
private TextView tv_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_result=(TextView) findViewById(R.id.tv_result);
//设置textView的显示模式为允许在原有文本的基础上追加新的文本
tv_result.setText(tv_result.getText(), BufferType.EDITABLE);
}
public void click(View v){
//显示声明意图
Intent intent=new Intent(this, SendResult.class);
//启动activity并要求返回结果,GET_CODE为请求码
startActivityForResult(intent, GET_CODE);
}
//使用startActivityForResult获取返回的结果,就必须重写onActivityResult方法
//在该方法中对返回值进行处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
/*
* 首先对请求码进行判断,当需要启动多个activity,并且需要获取每个activity返回的结果,
* 此时就需要用请求码来区分不同的子activity返回的结果。
* 本例只开启了一个子activity,请求码的作用不是很明显
*/
if(requestCode==GET_CODE){
/*
* Editable 是一个接口类型,对它的实例化对象作出任何改变都是对原有的实例化对象操作的,
* 内存地址还是原来的那个。简单地说就是可以灵活地、动态地追加文本内容。
* 本例就是说只有一个textView的文本对象,我们对文本所做的修改都是对这个对象所做的修改
* 修改内容会直接体现在这个文本对象上,而不需要再做对textView的赋值操作
*/
Editable text=(Editable) tv_result.getText();
/*判断结果码,结果码通过有两种RESULT_CANCELED和RESULT_Ok,前者表示子activity
* 被取消,没有返回预的结果,后者表示返回预期的结果
* */
if(resultCode==RESULT_CANCELED){
text.append("(Cancelled)");
}else{
text.append("(Okay");
text.append(Integer.toString(resultCode));
text.append(")");
if(data!=null){
text.append(data.getAction());
}
}
text.append("\n");
}
}
}
子activity类SendResult
public class SendResult extends Activity implements OnClickListener {
private Button bt_corky, bt_violet;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.send_result);
bt_corky = (Button) findViewById(R.id.bt_corky);
bt_violet = (Button) findViewById(R.id.bt_violet);
bt_corky.setOnClickListener(this);
bt_violet.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_corky:
sendResultCorky();
break;
case R.id.bt_violet:
sendResultViolet();
break;
default:
break;
}
}
/**
* 设定返回的结果并finish掉自己
*/
private void sendResultViolet() {
setResult(RESULT_OK, new Intent().setAction("Violet"));
finish();
}
private void sendResultCorky() {
setResult(RESULT_OK, new Intent().setAction("Corky"));
finish();
}
}
别忘了在配置文件中配置子activity。