在我们学习其他语言(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>