Android 组件系列-----Activity的传值和回传值
在这篇随笔里将讲解Activity的传值和回传值。
一、通过startActivity来进行Activity的传值
在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent intent)方法来传入一个Intent对象,这个Intent对象我们可以精确的指定我们需要跳转的Activity上,或者通过Intent对象来指定我们要完成的一个action操作。
①.通过setClass方法来指定我们要跳转的Activity
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, SecondActivity.class);
②.通过setAction方法来我们要完成的一个action操作
- Intent intent = new Intent();
- intent.setAction("com.xiaoluo.android_intent.second");
通过这种方式可以来指定我们的Intent对象要完成某个操作,这个操作可以是启动一个Activity,我们可以在AndroidManifest.xml中在 <Activity> 元素下指定一个 <intent-filter> 对象,然后其子元素声明一个 <action> 元素,这样我们可以将这个action动作绑定到了这个Activity上,即Android操作系统会去找与intent对象中指定的action名字的 <intent-filter>对象,然后执行相应的动作,例如:
- <activity
- android:name="com.xiaoluo.android_intent.SecondActivity"
- android:label="SecondActivity">
- <intent-filter>
- <action android:name="com.xiaoluo.android_intent.second"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
这样我们的Intent对象,在启动时,就会找到名字为 com.xiaoluo.android_intent.second 的<intent-filter>对象,来启动我们的SecondActivity。
我们来看看如何在Activity对象中进行值的传递,也是通过 Intent 对象的各种putExtra方法来进行传递:
MainActivity:
- public class MainActivity extends Activity
- {
- private Button button;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button);
- button.setOnClickListener(new ButtonListener());
- }
- class ButtonListener implements OnClickListener
- {
- @Override
- public void onClick(View v)
- {
- // Intent intent = new Intent();
- // intent.setClass(MainActivity.this, SecondActivity.class);
- Intent intent = new Intent();
- intent.setAction("com.xiaoluo.android_intent.second");
- intent.putExtra("com.xiaoluo.android_intent.age", 20); // 第一个参数指定name,android规范是以包名+变量名来命名,后面是各种类型的数据类型
- intent.putExtra("com.xiaoluo.android_intent.name", "xiaoluo");
- Bundle bundle = new Bundle(); // Bundle的底层是一个HashMap<String, Object
- bundle.putString("hello", "world");
- intent.putExtra("bundle", bundle);
- startActivity(intent);
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu)
- {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
SecondActivity:
- public class SecondActivity extends Activity
- {
- private TextView textView;
- private final String TAG = "SecondActivity";
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.second);
- textView = (TextView)findViewById(R.id.textView);
- // 得到跳转到该Activity的Intent对象
- Intent intent = getIntent();
- int age = intent.getIntExtra("com.xiaoluo.android_intent.age", 10);
- String name = intent.getStringExtra("com.xiaoluo.android_intent.name");
- Bundle bundle = intent.getBundleExtra("bundle");
- String world = bundle.getString("hello");
- Log.i(TAG, age + ", " + name + ", " + world);
- textView.setText(name + " : " + age + ", " + world);
- System.out.println(intent);
- }
- }
在第二个Activity对象中,可以通过 getIntent() 方法来得到跳转到这个Activity的Intent对象,然后通过 Intent 对象的各种 getXXExtra 方法来得到我们的传过来的值。
AndroidManifest.xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.xiaoluo.android_intent"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="18" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.xiaoluo.android_intent.MainActivity"
- 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
- android:name="com.xiaoluo.android_intent.SecondActivity"
- android:label="SecondActivity">
- <intent-filter>
- <action android:name="com.xiaoluo.android_intent.second"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
这样我们就可以实现Activity直接的值的传递。
二、通过startActivityForResult方法来得到Activity的回传值
在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。
例如,我们希望完成下面一个功能,在MainActivity上,写上一个算术表达式,然后跳转到到第二个SecondActivity上,在这个Activity上将第一个Activity的表达式显示出来,然后我们可以输入我们的算术表达式结果,然后点击按钮,将这个结果值又返回给我们的MainActivity,并将结果填充到算术表达式中,具体看如下代码:
activity_main.xml:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context=".MainActivity" >
- <EditText
- android:id="@+id/editText1"
- android:layout_width="70dp"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/textView1"
- android:layout_width="60dp"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/editText1"
- android:text=" + "
- android:textSize="30sp" />
- <EditText
- android:id="@+id/editText2"
- android:layout_width="60dp"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/textView1" />
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/editText2"
- android:text=" = "
- android:textSize="30sp" />
- <EditText
- android:id="@+id/editText3"
- android:layout_width="70dp"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/textView2" />
- <Button
- android:id="@+id/button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/editText3"
- android:layout_centerInParent="true"
- android:layout_marginTop="30dp"
- android:text="跳转到SecondActivity"/>
- </RelativeLayout>
second.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <TextView
- android:id="@+id/textView1"
- android:layout_width="70dp"
- android:layout_height="wrap_content"
- android:textSize="20sp"/>
- <EditText
- android:id="@+id/editText1"
- android:layout_width="60dp"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/textView1"/>
- <Button
- android:id="@+id/button1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/editText1"
- android:text="返回给MainActivity"/>
- </RelativeLayout>
然后我们来看看两个Activity
MainActivity:
- public class MainActivity extends Activity
- {
- private Button button;
- private EditText editText1;
- private EditText editText2;
- private EditText editText3;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button);
- editText1 = (EditText)findViewById(R.id.editText1);
- editText2 = (EditText)findViewById(R.id.editText2);
- editText3 = (EditText)findViewById(R.id.editText3);
- button.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- Intent intent = new Intent();
- intent.putExtra("message", editText1.getText().toString().trim() + " + " + editText2.getText().toString().trim() + " = ?");
- intent.setClass(MainActivity.this, SecondActivity.class);
- /*
- * 如果希望启动另一个Activity,并且希望有返回值,则需要使用startActivityForResult这个方法,
- * 第一个参数是Intent对象,第二个参数是一个requestCode值,如果有多个按钮都要启动Activity,则requestCode标志着每个按钮所启动的Activity
- */
- startActivityForResult(intent, 1000);
- }
- });
- }
- /**
- * 所有的Activity对象的返回值都是由这个方法来接收
- * requestCode: 表示的是启动一个Activity时传过去的requestCode值
- * resultCode:表示的是启动后的Activity回传值时的resultCode值
- * data:表示的是启动后的Activity回传过来的Intent对象
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data)
- {
- super.onActivityResult(requestCode, resultCode, data);
- if(requestCode == 1000 && resultCode == 1001)
- {
- String result_value = data.getStringExtra("result");
- editText3.setText(result_value);
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu)
- {
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
我们看到,这里我们使用的是 startActivityForResult 的这个方法,
- public void startActivityForResult (Intent intent, int requestCode)
- Same as calling startActivityForResult(Intent, int, Bundle) with no options.
- Parameters
- intent The intent to start.
- requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits.
- Throws android.content.ActivityNotFoundException
第一个指定我们的Intent对象,第二个requestCode指定我们的一个启动标志值,因为我们可能有多个按钮,如果都是跳转到同一个Activity对象上,我们需要对其进行标志,才知道是哪个Activity对象跳转过来的。
我们看到这里还有一个 onActivityResult 方法,这个方法就是用来处理我们Activity的回传值的方法,所有的Activity回传值的操作都是在这个方法中完成。
- protected void onActivityResult (int requestCode, int resultCode, Intent data)
- Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation.
- You will receive this call immediately before onResume() when your activity is re-starting.
- Parameters
- requestCode The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.
- resultCode The integer result code returned by the child activity through its setResult().
- data An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
接下来,我们看看SecondActivity这个类:
- public class SecondActivity extends Activity
- {
- private Button button;
- private TextView textView;
- private EditText editText;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.second);
- button = (Button)findViewById(R.id.button1);
- textView = (TextView)findViewById(R.id.textView1);
- editText = (EditText)findViewById(R.id.editText1);
- Intent intent = getIntent();
- String message = intent.getStringExtra("message").toString().trim();
- textView.setText(message);
- button.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- String result = editText.getText().toString().trim();
- Intent intent = new Intent();
- intent.putExtra("result", result);
- /*
- * 调用setResult方法表示我将Intent对象返回给之前的那个Activity,这样就可以在onActivityResult方法中得到Intent对象,
- */
- setResult(1001, intent);
- // 结束当前这个Activity对象的生命
- finish();
- }
- });
- }
- }
这个类里面我们将MainActivity传过来的值给TextView赋上,然后通过点击按钮将值回传给我们的 MainActivity,通过 setResult 方法可以将我们的值保存在Intent对象中,并返回给MainActivity对象,通过的 onActivityResult 方法来处理得到的回传Intent对象。finish()方法我们可以显示的结束这个Activity对象的生命。
最后我们来看一下AndroidManifest.xml文件:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.xiaoluo.android_activity"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="18" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.xiaoluo.android_activity.MainActivity"
- 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
- android:name="com.xiaoluo.android_activity.SecondActivity"
- android:label="SecondActivity" >
- </activity></application>
- </manifest>
我们来看看效果图:
Android 组件系列-----Activity的传值和回传值的更多相关文章
- Android组件系列----Activity组件详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android 组件系列-----Activity生命周期
本篇随笔将会深入学习Activity,包括如何定义多个Activity,并设置为默认的Activity.如何从一个Activity跳转到另一个Activity,还有就是详细分析Activity的生命周 ...
- Android 组件系列-----Activity初步
在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...
- Android 组件系列-----Activity保存状态
本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...
- Android组件系列----Activity的生命周期
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- 【转】Android 组件系列-----Activity保存状态
本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...
- Android组件系列----当前Activity跳转到另一个Activity的详细过程
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- 第01讲 Android开发系列---Activity
一. Android系统版本及详细信息 最新数据 https://developer.android.com/about/dashboards/ 二. Android项目初探 1. 使用a ...
- Android组件系列----BroadcastReceiver广播接收器
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
随机推荐
- Memcache学习php完整一例
header("Content-Type:text/html;charset=utf-8"); /* PHP设置分布式memcache存取 */ //创建memcache对象 $m ...
- python基础语法(3)
七.面向对象编程 python支持面向对象编程:类和对象是面向对象编程的两个主要方面,类创建一个新的类型,对象是这个类的实例. 对象可以使用普通的属于对象的变量存储数据,属于对象或类的变量被称为域:对 ...
- Linux查看当前目录下文件夹和文件的大小
File参数实际上是一个目录,就要报告该目录内的所有文件.如果没有提供 File参数,du命令使用当前目录内的文件. 如果File参数是一个目录,那么报告的块的数量就是分配到目录中文件以及分配到目录自 ...
- Java将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
java.io 类 BufferedWriter java.lang.Object java.io.Writer java.io.BufferedWriter BufferedWriter publi ...
- java实验一 20135104刘帅
实验报告 一.实验目的与要求: 实验目的: 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 实验要求: 1.没有Linux基础的同学建议先学习 ...
- [原] XAF 如何基于业务规则禁用属性
How to: Disable Property Editors Based on a Business Rule // Developer Express Code Central Example: ...
- log4j使用方法
项目在开发运行阶段,需要根据日志调试或者排错,这时候就需要有日志管理来帮助我们解决这些问题: 在java中我们可以使用System.out.println(),但是这种方式功能呢个太弱,而且不易控制, ...
- Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解
CRM 2013 里流程有4个类别:操作(action).业务流程(business process flow).对话(dialog)和工作流(workflow).它们都是从 setting –> ...
- WPF快速入门系列(1)——WPF布局概览
一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...
- 用 NuGet Package Explorer 管理你的攻城武器
缘由:每次新建一个工程,总是要从自己的“弹药库”或者之前的工程里面手动引用一些类库和脚本插件,难免有些繁琐和遗漏.想起经常用到的NuGet,跑到NuGet主页一看,发现有 NuGet Package ...