zoukankan      html  css  js  c++  java
  • [Android学习]Activity之间传递对象和对象集合

    开发过程中,Activity之间传递数据是必不可少的,android中使用Intent和Bundle作为数据载体,在Activity之间传递,对于基础数据类型,Bundle已经提供相关的put,get方法,而作为自定义的类型则需要有特别的要求.

    自定义类型,想要使用Bundle传递时,需要满足特定条件。即该类型需要实现Serializable接口或者Parcelable接口

    (注意:如果目标对象中包含其他对象,则被包含的对象也需要实现Serializable接口或者Parcelable接口)

    (关于Serializable接口和Parcelable接口就不在此做记录了)


    步骤:

    1.定义类,实现相关接口

    2.使用Intent和Bundle对应的方法set数据

    3.startActivity传递Intent对象


    使用Serializable

    一.传递对象

    a).定义类,实现Serializable接口

    public class Student implements Serializable
    {
        // members
        private String name;
        
        private String age;
        
        private int id;
        
        // getter setter
        public int getId()
        {
            return id;
        }
        public void setId(int id)
        {
            this.id = id;
        }
        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name;
        }
        public String getAge()
        {
            return age;
        }
        public void setAge(String age)
        {
            this.age = age;
        }
        
        /**
         * Serializable
         */
        private static final long serialVersionUID = 1L;
    }
    Student

    b).使用Intent传递对象

    // 使用Serializable
            Button btnSerializable = (Button)findViewById(R.id.btnSerializable);
            btnSerializable.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View arg0)
                {
                    // TODO Auto-generated method stub
                    
                    // create data
                    Student student = new Student();
                    student.setName("stephen lee");
                    student.setAge("12");
                    student.setId(1);
                    
                    // bundle
                    Bundle bundle = new Bundle();  
                    bundle.putSerializable(MainActivity.StudentKey,student);
                    
                    // intent
                    Intent intent = new Intent(arg0.getContext(),SecondActivity.class);
                    intent.putExtras(bundle);
                    
                    // navigate
                    startActivity(intent);
                }
            });
    使用Serializable

    c).获取传递的数据

    Bundle bundle = this.getIntent().getExtras();
            Student student = (Student)bundle.getSerializable(MainActivity.StudentKey);
            if(student!=null)
                textView.setText("name:" + student.getName() + "age:" + student.getAge() + "id:" + student.getId());
    SecondActivity

    二.传递对象集合

    a).同上

    b).同上(注意使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口)

            Button btnSerializableList = (Button)findViewById(R.id.btnSerializableList);
            btnSerializableList.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    // TODO Auto-generated method stub
                    
                    // create data
                    List<Student> students = new ArrayList<Student>();
                    
                    Student student1 = new Student();
                    student1.setName("hellenism");
                    student1.setAge("12");
                    student1.setId(1);
                    
                    Student student2 = new Student();
                    student2.setName("stephen lee");
                    student2.setAge("12");
                    student2.setId(2);
                    
                    students.add(student1);
                    students.add(student2);
                    
                    // bundle , 注意:使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口
                    Bundle bundle = new Bundle();  
                    bundle.putSerializable(MainActivity.StudentsKey,(Serializable)students);
                    
                    // intent
                    Intent intent = new Intent(v.getContext(),SecondActivity.class);
                    intent.putExtras(bundle);
                    
                    // navigate
                    startActivity(intent);
                }
            });
    使用Serializable

    c).同上(不足之处在于,由于获取数据时候,需要把Serializable强转成为对应的List<>,此处会有警告)

    Bundle bundle = this.getIntent().getExtras();
            List<Student> students = (List<Student>)bundle.getSerializable(MainActivity.StudentsKey);
            if(students!=null)
                textView.setText("name:" + students.get(1).getName() + "age:" + students.get(1).getAge() + "id:" + students.get(1).getId());
    SecondActivity

    使用Parcelable


    一.传递对象

    a).定义类,实现Parcelable接口

    public class Person implements Parcelable
    {
        // members
        private String name;
        private String age;
        private int id;
        
        // getter setter
        public int getId()
        {
            return id;
        }
    
        public void setId(int id)
        {
            this.id = id;
        }
    
        public String getName()
        {
            return name;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    
        public String getAge()
        {
            return age;
        }
    
        public void setAge(String age)
        {
            this.age = age;
        }
    
        // Parcelable
        @Override
        public int describeContents()
        {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags)
        {
            // TODO Auto-generated method stub
            dest.writeString(name);
            dest.writeString(age);
            dest.writeInt(id);
        }
        
        public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {  
            public Person createFromParcel(Parcel source) {  
                Person person = new Person();  
                person.age = source.readString();  
                person.name = source.readString();  
                person.id = source.readInt();  
                return person;  
            }  
            
            public Person[] newArray(int size) {  
                return new Person[size];  
            }  
        };  
    }
    Parcelable接口

    b).使用Intent传递参数

    // 使用Parcelable
            Button btnParcelable = (Button)findViewById(R.id.btnParcelable);
            btnParcelable.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View arg0)
                {
                    // TODO Auto-generated method stub
                    
                    // create data
                    Person person = new Person();
                    person.setName("i am person");
                    person.setAge("12");
                    person.setId(1);
                    
                    // bundle
                    Bundle bundle = new Bundle();  
                    bundle.putParcelable(MainActivity.PersonKey,person);
                    
                    // intent
                    Intent intent = new Intent(arg0.getContext(),SecondActivity.class);
                    intent.putExtras(bundle);
                    
                    // navigate
                    startActivity(intent);
                }
            });
    使用Intent

    c).获取传递的参数

    Bundle bundle = this.getIntent().getExtras();
            Person person = (Person)bundle.getParcelable(MainActivity.PersonKey);
            if(person!=null)
                textView.setText("name:" + person.getName() + "age:" + person.getAge() + "id:" + person.getId());
    获取传递的参数

    二.传递数据类型

    a).同上

    b).同上

            Button btnParcelableList = (Button)findViewById(R.id.btnParcelableList);
            btnParcelableList.setOnClickListener(new View.OnClickListener()
            {
                
                @Override
                public void onClick(View v)
                {
                    // TODO Auto-generated method stub
                    
                    // create data
                    List<Person> persons = new ArrayList<Person>();
                    
                    Person person1 = new Person();
                    person1.setAge("12");
                    person1.setName("stephen lee");
                    person1.setId(1);
                    
                    Person person2 = new Person();
                    person2.setAge("12");
                    person2.setName("hellenism");
                    person2.setId(2);
                    
                    persons.add(person1);
                    persons.add(person2);
                    
                    // bundle
                    Bundle bundle = new Bundle();  
                    bundle.putParcelableArrayList(MainActivity.PersonsKey, (ArrayList<? extends Parcelable>) persons);
                    
                    // intent
                    Intent intent = new Intent(v.getContext(),SecondActivity.class);
                    intent.putExtras(bundle);
                    
                    // navigate
                    startActivity(intent);
                }
            });
    使用Intent传递参数

    c).同上

    Bundle bundle = this.getIntent().getExtras();
            List<Person> persons = bundle.getParcelableArrayList(MainActivity.PersonsKey);
            if(persons!=null)
                textView.setText("name:" + persons.get(1).getName() + "age:" + persons.get(1).getAge() + "id:" + persons.get(1).getId());
    获取参数

    注意:

    使用以上方法传递对象时,都是创建了新的实例,而非传递对象的引用,如果是传递引用,也就无需序列化了。

    完整例子:

    http://pan.baidu.com/s/1dDf5p8d

    人生就是一局不能Again的DOTA
  • 相关阅读:
    配置类Configuration怎样使用
    MVC三和,你能辨别它?
    杭州电 1372 Knight Moves(全站搜索模板称号)
    Verilog之i2c合约
    android requestDisallowInterceptTouchEvent用途
    其简单的通用适配器的定义
    开发专题指南: JEECG高速微云开发平台前言
    (1)QlikView概要
    HDU2841 Visible Trees (容斥原理)
    每天进步一点点——Linux系统时间来处理
  • 原文地址:https://www.cnblogs.com/hellenism/p/3666209.html
Copyright © 2011-2022 走看看