zoukankan      html  css  js  c++  java
  • Android startActivityForResult 和 setResult的使用

    在Android中startActivityForResult主要作用就是:

    A-Activity需要在B-Activtiy中执行一些数据操作,而B-Activity又要将,执行操作数据的结果返回给A-Activtiy



    //看效果


    //看代码

    1. package sn.len.actres;  
    2.   
    3. import android.app.Activity;  
    4. import android.content.Intent;  
    5. import android.os.Bundle;  
    6. import android.view.View;  
    7. import android.view.View.OnClickListener;  
    8. import android.widget.Button;  
    9. import android.widget.TextView;  
    10.   
    11. public class ActivityResultDemoActivity extends Activity  
    12. {  
    13.     private Button button_start_task;  
    14.     private TextView TextView_result;  
    15.     @Override  
    16.     public void onCreate(Bundle savedInstanceState)  
    17.     {  
    18.         super.onCreate(savedInstanceState);  
    19.         setContentView(R.layout.main);  
    20.         button_start_task=(Button) findViewById(R.id.button_start_task);  
    21.         TextView_result=(TextView) findViewById(R.id.TextView_result);  
    22.         button_start_task.setOnClickListener(new button_start_task_Listener());  
    23.     }  
    24.     private class button_start_task_Listener implements OnClickListener  
    25.     {  
    26.         public void onClick(View v)  
    27.         {  
    28.             Intent intent=new Intent(ActivityResultDemoActivity.this,SimpleTaskActivity.class);  
    29.             //关键点来了,使用startActivityForResult来启动  
    30.             startActivityForResult(intent, 100);  
    31.         }  
    32.     }  
    33.     /** 
    34.      * 复写onActivityResult,这个方法 
    35.      * 是要等到SimpleTaskActivity点了提交过后才会执行的 
    36.      */  
    37.     @Override  
    38.     protected void onActivityResult(int requestCode, int resultCode, Intent data)  
    39.     {  
    40.         //可以根据多个请求代码来作相应的操作  
    41.         if(20==resultCode)  
    42.         {  
    43.             String bookname=data.getExtras().getString("bookname");  
    44.             String booksale=data.getExtras().getString("booksale");  
    45.             TextView_result.setText("书籍名称:"+bookname+"书籍价钱"+booksale+"元");  
    46.         }  
    47.         super.onActivityResult(requestCode, resultCode, data);  
    48.     }  
    49. }  

    //任务处理类
    1. package sn.len.actres;  
    2.   
    3. import android.app.Activity;  
    4. import android.content.Intent;  
    5. import android.os.Bundle;  
    6. import android.view.View;  
    7. import android.view.View.OnClickListener;  
    8. import android.widget.Button;  
    9. import android.widget.EditText;  
    10.   
    11. public class SimpleTaskActivity extends Activity  
    12. {  
    13.     private EditText EditText_bookname;  
    14.     private EditText EditText_booksale;  
    15.     private Button Button_task_fulfill;  
    16.   
    17.     @Override  
    18.     protected void onCreate(Bundle savedInstanceState)  
    19.     {  
    20.         super.onCreate(savedInstanceState);  
    21.         setContentView(R.layout.main2);  
    22.           
    23.         EditText_bookname=(EditText) findViewById(R.id.EditText_bookname);  
    24.         EditText_booksale=(EditText) findViewById(R.id.EditText_booksale);  
    25.         Button_task_fulfill=(Button) findViewById(R.id.Button_task_fulfill);  
    26.         Button_task_fulfill.setOnClickListener(new Button_task_fulfill_Listener());  
    27.     }  
    28.     private class Button_task_fulfill_Listener implements OnClickListener  
    29.     {  
    30.         public void onClick(View v)  
    31.         {  
    32.             String str_bookname=EditText_bookname.getText().toString();  
    33.             String str_booksale=EditText_booksale.getText().toString();  
    34.               
    35.             //判断空,我就不判断了。。。。  
    36.             Intent data=new Intent();  
    37.             data.putExtra("bookname", str_bookname);  
    38.             data.putExtra("booksale", str_booksale);  
    39.             //请求代码可以自己设置,这里设置成20  
    40.             setResult(20, data);  
    41.             //关闭掉这个Activity  
    42.             finish();  
    43.         }  
    44.     }  





    举例说我想要做的一个事情是,在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。
    /*****************************/ 华丽丽的分割线 /*****************************/
    目的: A.java 是主界面,B.java 是子功能模块,要从A启动B,B干完活之后把结果汇报给A
    先看 A.java 的相关代码
    //-- A.java --//
    /*
     * 要做两件事情,第一是用 startActivityForResult() 启动B,其次是回收B的结果
     */
    //启动B
    Intent bintent = new Intent(A.this, B.class);
    //设置 bintent的Bundle的一个值
    String bsay = "Hello, this is B speaking"; 
    bintent.putExtra("listenB", bsay)
    startActivityForResult(bintent,0); // 参数(Intent intent, Int requestCode) 的 requestCode 对应下面回收Bundle时识别用的
    //重写onActivityResult()来处理返回的数据,建议先看B.java 的代码再回来看这里比较好理解
    //这理有三个参数 requestCode, resultCode, data
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK
    case RESULT_OK:
    Bundle b=data.getExtras();  //data为B中回传的Intent
    String str=b.getString("ListenB");//str即为回传的值"Hello, this is B speaking"
    /* 得到B回传的数据后做什么... 略 */
                          break;
    default:
              break;
    }
    }
    -------------------------------------------------------------------------------------
    //-- B.java --//
    // 用 setResut() 准备好要回传的数据后,只要使用finish()的方法就能把打包好的数据发给A且运行onActivityResult()部分的代码
    Intent aintent = new Intent(B.this, A.class);
    /* 将数据打包到aintent Bundle 的过程略 */
    setResut(RESULT_OK,aintent); //这理有2个参数(int resultCode, Intent intent)
    ... ...
    finish();
    -------------------------------------------------------------------------------------
    OK,代码如上,可能这个时候还会有点疑问,关于参数的疑问。直接看android sdk 帮助说得更清楚。我发现网上有些文章还有吧 requestCode 和 resultCode 混淆说明错的。
    startActivityForResult(Intent intent, Int requestCode)
    intent 传给B的,不解释,看不懂你还是玩玩手机算了,别想开发的事情了
    requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。
    setResut(int resultCode, Intent intent)
    resultCode 如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的 RESULT_OK 值,没有特殊情况用它就好了,sdk有说明的,呵。
    intent 继续不解释,传回给A的onActivityResult()
    onActivityResult(int requestCode, int resultCode, Intent intent)
    这里三个都不用解释了,与上文对应的东西。如果不对requestCode和resultCode 加以识别区分的话,只要有其他activity setResult到了A  onActivityResult()会无差别处理。


    摘自:http://blog.csdn.net/yanglian20009/article/details/7238995 和  http://www.cnblogs.com/mubai/archive/2011/09/21/2183816.html




  • 相关阅读:
    HTML5结构
    HTML5新增的非主体元素header元素、footer元素、hgroup元素、adress元素
    CF GYM 100703G Game of numbers
    CF GYM 100703I Endeavor for perfection
    CF GYM 100703K Word order
    CF GYM 100703L Many questions
    CF GYM 100703M It's complicate
    HDU 5313 Bipartite Graph
    CF 560e Gerald and Giant Chess
    POJ 2479 Maximum sum
  • 原文地址:https://www.cnblogs.com/xieyuan/p/3787533.html
Copyright © 2011-2022 走看看