Android学习系列之(五)Activity之间的数据传递

前言:前面我们已经掌握了 Activity 的基本使用,但是那都是在同一个 Activity 中进行操作的。那么若我们要在不同 Activity 之间进行数据交互,这又如何实现?那现在我们依旧以模拟登录注册这一个例子来进行说明

一、需求说明:

模拟用户的登录注册行为,用户注册信息后,将注册时的账号、密码这一数据传递到登陆界面。

二、代码实现:

1.布局文件代码:

  • activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/et_uname"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/et_uname" />

    <EditText
        android:id="@+id/et_upass"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/et_upass" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="login"
            android:text="@string/bt_login" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="regist"
            android:text="@string/bt_regist" />
    </LinearLayout>

</LinearLayout>
  • activity_regist.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/et_uname"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/et_uname" />

    <EditText
        android:id="@+id/et_upass"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/et_upass" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="regist"
        android:text="@string/bt_regist" />

</LinearLayout>

2.java文件代码:

  • MainActivity.java:
public class MainActivity extends Activity {

	private EditText et_uname;
	private EditText et_upass;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initViews();

	}

	private void initViews() {
		et_uname = (EditText) findViewById(R.id.et_uname);
		et_upass = (EditText) findViewById(R.id.et_upass);
	}

	/**
	 * 登录
	 * @param view
	 */
	public void login(View view){
		String uname = et_uname.getText().toString().trim();
		String upass = et_upass.getText().toString().trim();

		if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){
			Toast.makeText(this, "用户名密码不能为空!", Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 注册
	 * @param view
	 */
	public void regist(View view){
		Intent intent = new Intent(this, RegistActivity.class);
		int requestCode = 0;	// 设置注册操作的请求码为 0
		startActivityForResult(intent, requestCode);
	}

	/**
	 * 当新开启的 Activity 被关闭时调用的方法: 在该函数内我们进行数据的处理
	 * 比如我们在此获取从 RegistActivity 中返回的数据
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		System.out.println("onActivityResult...");

		if(data != null){
			if(requestCode == 0){
				String uname = data.getStringExtra("uname");
				String upass = data.getStringExtra("upass");

				et_uname.setText(uname);
				et_upass.setText(upass);
			}
		}

	}
}

代码注解:

1) login(View view)、regist(View view): 这是按钮的点击事件,关于按钮点击事件的写法,请参考俺的另一篇博文:http://blog.csdn.net/gulu_gulu_jp/article/details/46876437

2) regist() 函数:因为需求的不同,我们若是依旧使用 startActivity(Intent intent) 这一 api 是不能满足我们的需求的,我们需要使用新的 api,即 startActivityForResult(Intent intent, int requestCode).该
api 允许我们打开一个 Activity,并当新打开的 Activity 关闭时,接受新 Activity 传递的值

3) 请求码(requestCode)的作用:主要用于区分操作的来源,若当前 Activity 中有两个操作都要打开一个新的 Activity 并获取其返回值,那么我们可以针对不同的操作设置不同的请求码,在 onActivityResult 中根据请求码来区分操作,进行相应业务的编码

4) onActivityResult(): 我们可以在该函数中处理被打开 Activity 返回的数据

  • RegistActivity.java:
public class RegistActivity extends Activity{

	private EditText et_uname;
	private EditText et_upass;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_regist);

		initViews();
	}

	private void initViews() {
		et_uname = (EditText) findViewById(R.id.et_uname);
		et_upass = (EditText) findViewById(R.id.et_upass);
	}

	public void regist(View view){
		String uname = et_uname.getText().toString().trim();
		String upass = et_upass.getText().toString().trim();

		if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){
			Toast.makeText(this, "用户名密码不能为空!", Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();

			int resultCode = 0;				// 返回码:与请求码类似,用于区分返回的结果(多条返回值时)
			/*
			 * 准备返回的数据:Intent 是可以传递数据的
			 */
			Intent data = new Intent();
			data.putExtra("uname", uname);
			data.putExtra("upass", upass);
			setResult(resultCode, data);	// 返回结果
			finish();						//  关闭当前 Activity:传递数据给当前 Activity 的调用者,调用者将执行 onActivityResult 方法
		}
	}

}

3.运行结果:

三、代码实现的第二种方法:Intent 的灵活使用

回顾一下刚刚的代码,想想我们是怎么来完成需求的:

1) 布局文件的编写

2) MainActivity:使用
startActivityForResult() 来打开 RegistActivity,并重写 onActivityResult() 方法

3) RegistActivity: 使用 Intent 保存返回的数据,并调用setResult(int resultCode, Intent data) 返回结果

经此三步,即可完成需求。那么,除了这一种方法外,我们能不能有其他的方法来实现呢?答案是:offcourse,灵活使用 Intent 就行

代码实现:布局文件不变

  • MainActivity.java:
public class MainActivity extends Activity {

	private EditText et_uname;
	private EditText et_upass;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initViews();

	}

	private void initViews() {
		et_uname = (EditText) findViewById(R.id.et_uname);
		et_upass = (EditText) findViewById(R.id.et_upass);

		Intent data = getIntent();		// 获取 Intent
		if(data != null){
			String uname = data.getStringExtra("uname");
			String upass = data.getStringExtra("upass");
			et_uname.setText(uname);
			et_upass.setText(upass);
		}
	}

	/**
	 * 登录
	 * @param view
	 */
	public void login(View view){
		String uname = et_uname.getText().toString().trim();
		String upass = et_upass.getText().toString().trim();

		if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){
			Toast.makeText(this, "用户名密码不能为空!", Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 注册
	 * @param view
	 */
	public void regist(View view){
		Intent intent = new Intent(this, RegistActivity.class);
		startActivity(intent);
		finish();
	}
}
  • RegistActivity.java:
public class RegistActivity extends Activity{

	private EditText et_uname;
	private EditText et_upass;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_regist);

		initViews();
	}

	private void initViews() {
		et_uname = (EditText) findViewById(R.id.et_uname);
		et_upass = (EditText) findViewById(R.id.et_upass);
	}

	public void regist(View view){
		String uname = et_uname.getText().toString().trim();
		String upass = et_upass.getText().toString().trim();

		if(TextUtils.isEmpty(uname) || TextUtils.isEmpty(upass)){
			Toast.makeText(this, "用户名密码不能为空!", Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();

			// 使用 Intent 保存数据
			Intent data = new Intent(this, MainActivity.class);
			data.putExtra("uname", uname);
			data.putExtra("upass", upass);
			startActivity(data);
			finish();
		}
	}
}

代码编辑完毕,我们运行测试一下,发现运行结果和上面的一模一样。很好,那么这种实现方法也通过了,需求完成,Congratulation!

版权声明:博客编写不易,转载时请注明出处,Thank you very much!

时间: 2024-12-28 01:29:54

Android学习系列之(五)Activity之间的数据传递的相关文章

Android中在两个Activity之间进行数据传递

首先声明,此篇文章是我原先的CSDN上面的博客,由于种种原因,不想再使用csdn博客,于是就将其文章搬至现在的cnblog. 大家好,今天我终于开通了自己的博客,很开心能和大家共同分享我的学习经验,希望我们可以共同进步哦,废话不多说了,看一下我今天学习android遇到的一些问题和解决办法吧 首先先把我使用的eclipse的版本贴出来:adt-bundle-windows-x86-20130917 这是一个集成的版本,不需要配置SDK和ADT,但是需要手动配置JDK哦! 其实,不同版本的ecli

Android笔记(四) Activity之间的数据传递

我们之前使用Intent进行Activity之间的跳转,其实Intent还可以在启动活动的时候传递数据. Intent提供了一系列的putExtra方法以便我们把想要传递的数据暂存在Intent中,待到启动了另外一个Activity后,只需要把这些数据再从Intent取出即可. 通过例子我们查看: 1)新建loginAPP工程 2)LonginActivity.java import android.content.Intent; import android.support.v7.app.Ap

Activity之间的数据传递-android学习之旅(四十七)

activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传递数据. 代码示例 dto类person package peng.liu.test; import java.io.Serializable; /** * Created by lplp on 2015/6/22. */ public class Person implements Seriali

(Android review)Activity之间的数据传递

一.基本知识点 1.Activity之间传递数据1)传递基本类型或String intent.putExtra("username", username);  getIntent(); intent.getStringExtra("username"); 2)以bundle的形式传 Bundle bundle = new Bundle();    bundle.putString("username", username);    bundle.

Intent 意图 用于Activity之间的数据传递

转自:http://blog.sina.com.cn/s/blog_83940dfb0100veas.html 用于Activity之间的数据传递 在起始Activity中,发送数据 protected void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); setContentView(R.layout.thisactivity); Intent intent = new Intent(); //设

Activity之间的数据传递

最常用的Activity之间的数据传递. 1 btnStartAty1.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 Intent i=new Intent(MainActivity.this, Activity1.class); 5 //Activity之间的数据传递 6 //i.putExtra("txt", "这是第一种Activ

Android学习之Activity之间的数据传递

Activity与Activity之间很多情况下都需要进行数据的传递,下面就用几个简单的例子来看一下. (一).一个Activity启动另一个Activity并将数据传递到这个Activity当中 思路:1.通过Intent进行数据的传递,Intent作为数据的载体.2.首先将要传递的数据放入到Intent当中.这里用到了Intent中的putExtra()方法,这个方法有一系列的重载.3.启动另一个Activity后将数据从Intent中取出来.这里用到了getStringExtra()方法,

Android中Activity之间的数据传递ngti

在开发中,我们经常涌用到Activity,那么既然用到了Activity,就一定免不了在两个Activity之间传递数据.这里我们先说一说原理,在看看代码和例子. 情况A:我们需要从Activity_1启动并传递数据到Activity_2,Activity_2只需要接收来自Activity_1 的数据,但并不用做其他操作. 情况B:我们需要从Activity_1 启动Activity_2,同时希望Activity_2在销毁的时候向Activity_1传递数据. 首先我们来说一说情况A. 情况A是

activity之间的数据传递方法

1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Intent包含两部分: 1 目的[action]-------要去到哪里去 2 内容[category.data]----------路上带些什么,区分性数据和内容性数据 简单数据传递: Intent intent = new Intent(LoginActivity.this, MainActivity