Activity 的切换(含Bundle传值)

来源:互联网 发布:梦幻西游2mac更新失败 编辑:程序博客网 时间:2024/05/22 16:07

1. 代码    

1、 2Activity 的切换,没有数据传递

1. //AB

2. Intent intent = new Intent();

3. intent.setClass(A.this, B.class);

4. startActivity(intent);

5. A.this.finish();

2、 2Activity 之间传递数据(简单)

//A数据传给B 

//A中代码:passData 是自定义的识别标志,可以随便命名还可以添加多个

Intent intent = new Intent(); 

intent.setClass(A.thisB.class); 

Bundle mBundle = new Bundle(); 

mBundle.putString("passData""ray'blog");//压入数据 

intent.putExtras(mBundle); 

startActivity(intent);

A.this.finish();

//B中接受数据的代码:

//读出数据, 则data的值为 rayblog

        Bundle bundle = getIntent().getExtras();  

String data = bundle.getString( "passData" );

 3、 2Activity 之间传递数据(复杂方法我没看懂)

    相关的几个函数
    startActivityForResult
    public final void setResult(int resultCode, String data)
    回调函数

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 

 

   例如AB, B得到A数据  

1. //AB

2. static final int RG_REQUEST = 0;

3. Intent intent = new Intent();

4. intent.setClass(A.this, B.class);

5. startActivityForResult(intent,RG_REQUEST);

6.                                   

7. //B中处理

8. Bundle bundle = new Bundle();
bundle.putString("DataKey", edittext.getText().toString());//bundle 写入数据
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
finish();

9. 

10. //最后在A的回调函数里面接收数据

11. if (requestCode == RG_REQUEST) {
      if (resultCode == RESULT_CANCELED)
           setTitle("Canceled...");
      else if(resultCode == RESULT_OK) {
          setTitle((String)data.getCharSequenceExtra("DataKey"));
       }
 }

2. 详解: 

一个Android应用程序很少会只有一个Activity对象,如何在多个Activity之间进行跳转,而且能够互相传值是一个很基本的要求。

  在前面创建的MyApp中,我们通过点击按钮可以更新当前界面上的文本内容。现在我们想换种方式,在点击按钮后,显示一个新的屏幕,在这个屏幕上输入一段话,然后再返回到原先的界面显示刚才输入的那句话。

  首先我们新建这个新屏幕的布局文件input.xml,并添加一个文本输入框和一个按钮(注意,xml元素的命名不要和其他布局文件中的定义重名,因为所有的资源都在R中进行索引,比如id,如果重名了在使用R.id.*的时候就会有问题了)。这个布局文件对应的是一个Activity,因此我们再新建一个Input类(继承自Activity)用于显示这个布局并响应事件。

  然后,还有一个重要的工作,那就是在清单文件AndroidManifest.xml中告诉程序,我定义了一个新的Activity,你可以去调用它。

  我们希望在以前的那个主界面上点击按钮以后可以跳转到文本输入界面,所以我们需要对按钮的onClick事件进行定义:

  在这段代码里出现了一些新东西。首先是Intent,它是Android一个很重要的类.Intent直译是“意图”,什么是意图呢?比如你想从这个Activity跳转到另外一个Activity,这就是一个意图。它不但可以连接多个Activity,还可以在它们之间传递数据。在这里,我们就是用IntentMyApp对象跳转到了Input对象。

再看紧跟着的startActivityForResult()方法,顾名思义,它可以从一个定义好的Intent对象启动一个新的Activity,并且,这个Activity会返回执行的结果,这些内容下面马上就会提到。

好,这里我们已经可以调出新Activity了,我们看一下执行的结果:

  你马上可以想到,现在需要对新的ActivityInput)进行处理了。我们在点击“确定”按钮的时候,需要获得上面EditText对象中的文本,然后返回到前一个ActivityMyApp)中去。看我们的按钮事件处理:

  这里的关键是SharedPreferences对象,这是在多个Activity(同一包中)共享数据的方式,本质上它就是一个可以在包的范围内进行数据共享的文件。

  我们通过一个标签“Text”获得了和文本相关的那个SharedPreferences对象(“Text”仅仅是自己定义的一个标签),然后给它赋予一个“text”对象值为当前文本框中输入的文本。设置完成以后,设置当前Activity的执行结果为RESULT_OK,再关闭当前的Activity,剩下的事情就可以回到MyApp这个主界面中去执行了。

  其实剩下的事情也很简单,在MyApp这个Activity中,我们需要重写一个函数,onActivityResult()。因为我们启动Input这个Activity的时候使用的是startActivityForResult()方法,这个方法会使Input执行完以后返回给MyApp一个结果,MyApp接收到返回结果的时候会触发onActivityResult事件,对于结果的处理就在onActivityResult()中进行。同样,我们通过“Text”这个标签获得SharedPreferences对象,再把字符串从“text”对象中取出来并显示到当前屏幕上。

  另外说明一下,requestCode是用来标识请求对象,我们刚才在启动Activity的时候使用的是“startActivityForResult(intent, 0)”,这里的0就是requestCode,当然,你可以设置成任何你喜欢的值。

  我们看一下执行结果:

原创粉丝点击