第一个activity代码:
- package cn.com.chenzheng_java;
- 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.TextView;
- public class ForResultActivity extends Activity {
- private TextView textView;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- textView = (TextView)findViewById(R.id.textView2);
- Button button = (Button)findViewById(R.id.button12);
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- run();
- }
- });
- }
- private void run() {
- Intent intent = new Intent();
- intent.putExtra("name", "chenzheng_java");
- intent.putExtra("age", 23);
- intent.putExtra("isMan", true);
- intent.putExtra("description", "送你一个帅哥");
- intent.setClass(ForResultActivity.this, ReturnResultActivity.class);
- // 通过该方法可以获取后边的activity返回的数据(主要还是通过intent进行交互的)
- startActivityForResult(intent, 1);
- }
- /***
- * 想要获取后边的activity中返回的内容就要重写该方法 该方法将会在后边的activity调用setResult方法后被触发。
- * requestCode 请求码
- * 即我们在startActivityForResult中指定的那个1,我们可以通过这个标识判断,后边activity返回的是不是我们请求的东西
- * resultCode 返回的结果码 后边的activity给我们的一个标识状态信息的值
- * data 返回的intent对象
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (resultCode) {
- case RESULT_OK:
- Bundle bundle = data.getExtras();
- String info = bundle.getString("info");
- textView.setText(info+" requestCode="+requestCode);
- break;
- default:
- break;
- }
- }
- }
第二个activity代码:
- package cn.com.chenzheng_java;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- public class ReturnResultActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.layout1);
- Button button = (Button)findViewById(R.id.button);
- button.setOnClickListener(new View.OnClickListener(){
- @Override
- public void onClick(View v) {
- Intent intent2 = new Intent();
- intent2.putExtra("info", "hahahaha");
- // 通过调用setResult方法返回结果给前一个activity。
- ReturnResultActivity.this.setResult(RESULT_OK, intent2);
- //关闭当前activity
- ReturnResultActivity.this.finish();
- }});
- }
- }
记住,要在androidmanifest.xml文件中声明两个activity哦,代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.com.chenzheng_java"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="8" />
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".ForResultActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <!-- 这里一定要声明该activity,否则系统是找不到该activity的 -->
- <activity android:name="ReturnResultActivity"></activity>
- </application>
- </manifest>
-------------------------------------------------------------------------
让我们来总结下,关于activity之间相互跳转的问题:
activity与activity之间的跳转是通过意图Intent进行的。
intent有一个setClass方法,Intent setClass(Context packageContext, Class<?> cls)第一个参数为当前context,第二个参数为要跳转到的activity。
我们跳转时,可以通过startActivity()方法进行跳转,这样的跳转是没有返回值的。如果你想要后边的activity返回给当前activity一些数据的话,那么只能通过startActivityForResult()方法。void startActivityForResult(Intent intent, int requestCode),第一个参数为intent,第二个参数为一个请求码,这个数字是你自己设定的。
除此之外,我们要想获得后边的activity返回给我们的数据,我们还要在当前activity中实现,onActivityResult(int requestCode, int resultCode, Intent data) 方法,其中requestCode与startActivityForResult方法中的requestCode保持一致。(requestCode实际上很有用,如果我们当前的activity可以跳转到很多activity,并且每一个activity都会返回给你数据,那么我们是如何判断到底返回的数据是哪个请求的呢,这里就是用的requestCode)。
在后边的activity中(被我们通过startActivityForResult方法启用的activity),我们通过this.setResult()方法来返回数据,setResult(int resultCode, Intent data)第一个参数为标识位,就是我们前一个activity实现onActivityResult方法时的resultCode,我们可以通过该值知道数据处理是否成功。
可能取值为:RESULT_CANCELED RESULT_OK RESULT_FIRST_USER。
在setResult()之后调用finish方法是为了销毁当前activity,让前一个activity获得显示机会。
此外,还可以通过 intent.setClassName(String packageName, String className) 方法设置跳转目标,其中packageName是当前activity的包名称,className是目标activity的全路径名,这里一定要注意,是全路径名称!
当然还有Intent 的setClassName(Context packageContext, String className)也是同样的功能,这里贴出他们的api部分。
转自:http://blog.csdn.net/chenzheng_java/article/details/6232487
另android.support.v4.app.Fragment无法接收onActivityResult方法的解决办法:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
List<Fragment> fragments = getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
}
参考:http://stackoverflow.com/questions/13580075/onactivityresult-not-called-in-new-nested-fragment-api