在我们学习其他语言(javascript,C#,J2SE AWT)的时候可能会遇到模式窗体的概念,
就是一个父窗体,打开一个子窗体,关闭子窗体时候,获取父窗体界面的数值。
大致步骤:
1.一个Activity(AndroidActivityWinModelParentActivity)启动另外一个
Activity(AndroidActivityWinModelSonActivity),这里称子Activity;
2.子Activity(AndroidActivityWinModelSonActivity)通过setResult方法设置返回结果,
setResult方法带两个参数:结果码和表示为Intent的负载值;
3.父Activity(AndroidActivityWinModelParentActivity)通过onActivityResult方法
处理子Activity(AndroidActivityWinModelSonActivity)返回的结果
让子Activity有返回值
使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会给父Activity提供任何反馈。
你可以启动一个Activity作为子Activity,它与父Activity有内在的联系。当子Activity关闭时,它会触发父Activity
中的一个事件处理函数。子Activity最适合用在一个Activity为其它的Activity提供数据(例如用户从一个列表中选择
一个项目)的场合。
子Activity的创建和普通Activity的创建相同,也必须在应用程序的manifest中注册。任何在manifest中注册的Activity
都可以用作子Activity。
启动子Activity
startActivityForResult方法和startActivity方法工作很相似,但有一个很重要的差异。
Intent都是用来决定启动哪个Activity,你还可以传入一个请求码。
这个值将在后面用来作为有返回值Activity的唯一ID。
处理子Activity的结果
当子Activity关闭时,它的父Activity的onActivityResult事件处理函数被触发。
重写这个方法来处理从子Activity返回的结果。onActivityResult处理器接受好几个参数:
❑ 请求码
曾经用来启动子Activity的请求码。
❑ 结果码
结果码是由子Activity设置的,用来显示它的结果。它可以是任何整数值,但典型的值是Activity.RESULT_OK和Activity.RESULT_CANCELLED。
如果子Activity非正常关闭或在关闭时没有指定结果码,结果码都是Activity.RESULT_CANCELED。
❑ 数据
一个Intent来打包任何返回的数据。依赖于子Activity的目的,它可能会包含一个代表特殊的从列表中选择的数据的URI。可变通的,或额外的,子Activity可以使用“extras”机制以基础值的方式返回临时信息。
package com.easyway.win.model;
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;
/**
*
*
* @Title:
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-7-20
* @author longgangbai
* @version 1.0
*/
public class AndroidActivityWinModelParentActivity extends Activity {
//设置标志的请求编码
private static final int WIN_MODEL_REQUEST_CODE=0x234;
private Button btnSetting;
private EditText text;
/**
*
*/
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.parent_layout);
btnSetting=(Button)findViewById(R.id.btnsetting);
text=(EditText)findViewById(R.id.tv_store_data);
btnSetting.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//父Activitiy向子类Activity传递数据
Intent intent=new Intent(AndroidActivityWinModelParentActivity.this,AndroidActivityWinModelSonActivity.class);
//设置数据信息
intent.putExtra("deliverInfo","中国人民共和共");
//备注此处启动方式为startActivityForResult(intent,请求编码)而不是startActivity(intent)
//这是startActivityForResult和startActivity的重要区别,
//1.是否传递请求编码
//2.是否可以调用子类的方法
startActivityForResult(intent, WIN_MODEL_REQUEST_CODE);
}
});
}
/**
* @param requestCode请求编码
*
* @param resultCode 响应编码
*
* @param data 子类的数据信息
*
* (non-Javadoc)
* @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
*/
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
if (requestCode == WIN_MODEL_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
String content=intent.getStringExtra("settingContent");
text.setText(content);
}
}
}
}
package com.easyway.win.model;
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;
/**
*
*
* @Title:
* @Description: 实现TODO
* @Copyright:Copyright (c) 2011
* @Company:易程科技股份有限公司
* @Date:2012-7-20
* @author longgangbai
* @version 1.0
*/
public class AndroidActivityWinModelSonActivity extends Activity {
private Button btnSave;
private Button btnCancel;
private EditText text;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取父窗体的intent信息
final Intent intent=getIntent();
String initText=intent.getStringExtra("deliverInfo");
setContentView(R.layout.son_layout);
btnSave=(Button)findViewById(R.id.btn_save);
btnCancel=(Button)findViewById(R.id.btn_cancel);
text=(EditText)findViewById(R.id.infoContent);
//设置初始化信息
text.setText(initText);
//添加事件
btnSave.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//获取用户输入信息
String content=text.getText().toString();
//设置在intent中存储
intent.putExtra("settingContent", content);
//设置回调的方法
setResult(Activity.RESULT_OK, intent);
//关闭当前的窗体
finish();
}
});
btnCancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
text.setText("");
setResult(RESULT_CANCELED, null);
finish();
}
});
}
}
<?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="vertical" android:focusable="true" android:focusableInTouchMode="true" > <Button android:id="@+id/btnsetting" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="设置" /> <EditText android:id="@+id/tv_store_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="false" android:lines="5" android:maxLines="10" android:hint="用于存储子Activity返回的数据"> </EditText> </LinearLayout>
<?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="vertical" > <EditText android:id="@+id/infoContent" android:layout_width="match_parent" android:layout_height="357dp" android:layout_weight="0.90" android:height="600dp" android:hint="请输入信息,点击保存传递子Activity,点击取消不传递数据,请知悉!" android:lines="100" android:maxLines="200" > </EditText> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <Button android:id="@+id/btn_save" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="保存" > </Button> <Button android:id="@+id/btn_cancel" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="取消" /> </LinearLayout> </LinearLayout>