效果:有两个Activity分别为A和B,从A中采用Bundle封装数据向B中传递数据,然后使用startActivityForResult在B中修改后回传数据。
第一个Activity的layout如main.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent"> 6 <TextView 7 android:id="@+id/text" 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="Welcome to my blog:"/> 11 <Button 12 android:id="@+id/edit_btn" 13 android:layout_width="fill_parent" 14 android:layout_height="wrap_content" 15 android:text="编辑"/> 16 </LinearLayout>
效果如下:
刚开始只是一个TextView显示Welcome to my blog:现在需要的是在点击编辑按钮时将TextView里的数据传递给第二个Activity编辑,然后回传编辑后的数据。
在第一个Activity中,采用Bundle封装并传递数据,从TextView里获取文本用getText()方法,核心代码如下:
1 text = (TextView)findViewById(R.id.text); 2 editBtn = (Button)findViewById(R.id.edit_btn); 3 editBtn.setOnClickListener(new OnClickListener(){ 4 @Override 5 public void onClick(View v) { 6 // TODO Auto-generated method stub 7 Bundle bundle = new Bundle(); 8 bundle.putString("text_view", text.getText().toString()); 9 Intent intent = new Intent(DataTransActivity.this, SecondActivity.class); 10 intent.putExtras(bundle); 11 startActivityForResult(intent, 0); 12 } 13 });
Android中startActivityForResul(Intent intent, int requestCode)的主要作用就是它可以回传数据,这里需注意的是requestCode要大于等于0,用于回传时识别用的。
好了,数据是发出去了,那怎样在第二个Activity接收呢?先开布局文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 <EditText 8 android:id="@+id/edittext" 9 android:layout_width="fill_parent" 10 android:layout_height="300dp" /> 11 <LinearLayout 12 android:orientation="horizontal" 13 android:layout_width="fill_parent" 14 android:layout_height="wrap_content"> 15 <Button 16 android:id="@+id/submit" 17 android:layout_width="0dp" 18 android:layout_height="wrap_content" 19 android:layout_weight="1.0" 20 android:text="确定"/> 21 <Button 22 android:id="@+id/cancel" 23 android:layout_width="0dp" 24 android:layout_height="wrap_content" 25 android:layout_weight="1.0" 26 android:text="取消"/> 27 </LinearLayout> 28 </LinearLayout>
效果图如下,图中文字http://www.cnblogs.com/sense7/是我另外加进去的,从主Activity传递过来的数据是Welcome to my blog:确定按钮会把修改过的数据回传,取消按钮则会返回主Activity然后提示未作任何修改。
首先接收主Activity穿过来的数据:
1 Bundle bundle = getIntent().getExtras(); 2 editText.setText(bundle.getString("text_view"));
接下来确定按钮将修改过的数据封装回传:
1 submit.setOnClickListener(new OnClickListener(){ 2 @Override 3 public void onClick(View v) { 4 // TODO Auto-generated method stub 5 // 实例化 Bundle,设置需要传递的参数 6 Bundle bundle = new Bundle(); 7 bundle.putString("edit_text", editText.getText().toString()); 8 SecondActivity.this.setResult(RESULT_OK, SecondActivity.this.getIntent().putExtras(bundle)); 9 SecondActivity.this.finish(); 10 } 11 });
点击取消按钮的代码:
1 cancel.setOnClickListener(new OnClickListener(){ 2 @Override 3 public void onClick(View v) { 4 // TODO Auto-generated method stub 5 SecondActivity.this.setResult(RESULT_CANCELED); 6 SecondActivity.this.finish(); 7 } 8 });
其中setResut(int resultCode, Intent intent)将结果回传,resultCode用于区分不同的返回结果,RESULT_OK和RESULT_CANCELED是自带的参数,方便使用,在下面还会提一下,而intent中可以封装修改后的数据传回给主Activity。还有一点就是,最后要调用当前Activity的finish()方法。
下面在主Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法,requestCode和startActivityForResul(Intent intent, int requestCode)中requestCode的对应,resultCode则是上面穿过来的值,data是回传的值。重写方法的代码为:
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 3 // TODO Auto-generated method stub 4 super.onActivityResult(requestCode, resultCode, data); 5 if (resultCode == RESULT_OK) { 6 Bundle bundle = data.getExtras(); 7 text.setText(bundle.getString("edit_text").toString()); 8 }else if (resultCode == RESULT_CANCELED) { 9 Toast.makeText(this, "未作任何修改", Toast.LENGTH_SHORT).show(); 10 } 11 }
修改文字点击确定返回后的效果图如下:
点击取消返回后的效果图如下: