• Android学习之路——Android四大组件之activity(二)数据的传递


    上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递

    activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据。另一种数据类型是parcelable和serialable

    用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下。

    一、利用bundle传递基本数据类型

    1、启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(intent)就能够将数据究竟到目标activity中去

    AActivity中传递数据:

    Intent intent = new Intent(AActivity.this, BActivity.class);
    intent.putExtra("name", "android");
    intent.putExtra("age", 20);
    intent.putExtra("isStudent", true);
    startActivity(intent);
    BActivity中接收数据: 目标activity中通过getIntent()方法获取Intent 对象,然后就能够通过getString getInt getBoolean等方法获取到传递过来的基本数据类型的数据

    String name = getIntent().getStringExtra("name");
    int age = getIntent().getIntExtra("age", 0);
    Boolean isStudent = getIntent().getBooleanExtra("isStudent", false);

    执行结果:




    2、关闭时返回数据

    AActivity中启动activity

    Intent intent = new Intent(AActivity.this, BActivity.class);
    startActivityForResult(intent, 1);
    BActivity中关闭activity并返回数据到AActivity

    B中要做的工作有将要返回的数据放入intent中,然后设置返回结果码setResult(resultCode)一般结果码都是Activity.RESULT_OK,然后调用finish方法,关闭activity,返回到之前的activity

    Intent intent = new Intent();
    intent.putExtra("name", "这是bactivity关闭传递的数据");
    setResult(Activity.RESULT_OK,intent);
    finish();

    接下来要在启动前的activity中接收返回的数据,重写ActivityResult方法就可以,第三个參数就是带数据的intent

    @Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		// TODO Auto-generated method stub
    		super.onActivityResult(requestCode, resultCode, data);
    		if (resultCode == Activity.RESULT_OK) {
    			switch (requestCode) {
    			case 100:
    				resultTxt.setText(data.getStringExtra("result"));
    				break;
    			default:
    				break;
    			}
    		}
    		
    	}

    二、利用parcelabel和serializable传递复杂数据类型

    1、parcelable传递数据

    假设要传递自己定义的数据类型,那么将自己定义数据类型实现parcelable接口就可以。传递方法例如以下:

    自己定义数据类型要实现parcelable接口,然后实现两个个方法describeContents   writeToParcel而且创建一个CREATOR,例如以下所看到的:

    package com.yang.intentdemo;
    
    import java.io.Serializable;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Person implements Parcelable {
    	private String name;
    	private int age;
    	private String job;
    
    	public Person(String name, int age, String job) {
    		super();
    		this.name = name;
    		this.age = age;
    		this.job = job;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + ", job=" + job + "]";
    	}
    
    	public Person() {
    		super();
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public String getJob() {
    		return job;
    	}
    
    	public void setJob(String job) {
    		this.job = job;
    	}
    
    	@Override
    	public int describeContents() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    	@Override
    	public void writeToParcel(Parcel dest, int flags) {
    		dest.writeString(name);
    		dest.writeInt(age);
    		dest.writeString(job);
    		// TODO Auto-generated method stub
    
    	}
    
    	public static final Creator<Person> CREATOR = new Creator<Person>() {
    
    		@Override
    		public Person createFromParcel(Parcel source) {
    			// TODO Auto-generated method stub
    			return new Person(source.readString(),source.readInt(),source.readString());
    		}
    
    		@Override
    		public Person[] newArray(int size) {
    			// TODO Auto-generated method stub
    			return new Person[size];
    		}
    	};
    
    }

    传递对象:

    在MainActivity中传递对象:

    Intent intent = new Intent(MainActivity.this,ReceivActivity.class);
    Person person = new Person();
    person.setName("zhangsan");
    person.setAge(20);
    person.setJob("IOS");
    intent.putExtra("person", person);
    startActivity(intent);

    在ReceiveActivity中取出对象:

    Person person = getIntent().getParcelableExtra("person");//接收对象
    		if (person!=null) {
    			tv1.setText("接收的对象是:"+person.toString());
    		}
    显示结果例如以下:



    传递集合:

    在MainActivity中传递集合:

    Intent intent = new Intent();
    				ArrayList<Person> persons = new ArrayList<Person>();
    				Person person = new Person("wangwu", 18, "Android");
    				Person person1 = new Person("lisi", 26, "PHP");
    				Person person2 = new Person("zhaoliu", 24, "IOS");
    				persons.add(person);
    				persons.add(person1);
    				persons.add(person2);
    				intent.putParcelableArrayListExtra("persons", persons);
    				intent.setClass(MainActivity.this, ReceivActivity.class);
    				startActivity(intent);

    在ReceiveActivity中取出集合:

    ArrayList<Person> persons = getIntent().getParcelableArrayListExtra("persons");
    		
    		if (persons!=null && persons.size()>0) {
    			
    			StringBuilder sb = new StringBuilder();
    			
    			for(Person personlist : persons){
    				sb.append(personlist.getName()+"=="+personlist.getAge()+"=="+personlist.getJob()+"
    ");
    			}
    			
    			tv2.setText(sb.toString());
    		}
    结果显演示样例如以下:



    2、serializable传递数据





  • 相关阅读:
    第二周课程进度
    Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
    Codeforces Round #538 (Div. 2) C. Trailing Loves (or L'oeufs?) (分解质因数)
    Codeforces Round #162 (Div. 1) B. Good Sequences (dp+分解素数)
    Codeforces Round #552 (Div. 3) F. Shovels Shop (前缀和预处理+贪心+dp)
    桂林电子科技大学第三届ACM程序设计竞赛 G 路径
    Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)
    Codeforces Round #324 (Div. 2) (哥德巴赫猜想)
    Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)
    Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4007112.html
Copyright © 2020-2023  润新知