Bundle在Activity之间交换数据

Posted tuke_tuke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bundle在Activity之间交换数据相关的知识,希望对你有一定的参考价值。

在Activity之间进行数据交换有一个“信使”:Intent,因此主要是将需要交换的数据放入Intent即可

Intent提供了多个重载方法,“携带”额外的数据

放入Bundle数据:

putExtras(Bundle data);向Intent中放入需要“携带”数据包

Bundle getExtras();取出Intent所“携带”的数据包

放入键值数据:(源码底层实际上还是使用的Bundle)

putExtra(String name,Xxx value);按key-value形式放入数据,Xxx是任意类型

getXxxExtra(String name);按key值取出指定类型的数据

技术分享

技术分享

Bundle就是一个简单的数据携带包,Bundle方法:

放入基本类型:

putXxx(String key,Xxx data);向Bundle中放入Int,Long等各种类型的数据

getXxx(String key);取出Int,Long等各种类型数据

放入对象

putSeralizable(String key,Seralizable data);放入一个可序列化的对象

getSeralizable(String key,Seralizable data);取出一个可序列化的对象

技术分享

一般第一个Activity中:
* Bundle放数据用:
* putXxx(String key,Xxx value);想Bundle中放入int,Long等简单数据类型
* putSerializable(String key,Serializable data);想Bundle中放入可序列化的对象,主要用于放对象
* Intent放Bundle用:
* putExtras(Bundle data):向Intent中放入需要“携带”的数据包

被启动的Activity中:
* Intent取数据:
* Bundle getExtras();取出Intent所“携带”的数据包
* getXxxExtras(String key);从Intent中按key取出指定类型的数据,便携方式取Bundle中的数据



用第二个Activity处理注册信息:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请输入您的注册信息"
        android:textSize="20dp" />

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="账号:"
            android:textSize="20dp" />

        <EditText
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="请输入账号"
            android:selectAllOnFocus="true" >
        </EditText>
    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密码:"
            android:textSize="20dp" />

        <EditText
            android:id="@+id/password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="请输入密码"
            android:inputType="textPassword" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="性别:"
            android:textSize="20dp" />

        <RadioGroup
            android:id="@+id/radioGroup1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="男" />

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="女" />
        </RadioGroup>

    </TableRow>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="注册" />

</TableLayout>
技术分享
MainActivity.java

package com.hust.bundletest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;

/*用第二个Activity处理注册信息。
 * 在Activity之间进行数据交换是同过Intent信使来实现的。Intent提供了多种重载的方法,来携带额外数据:
 * 1,使用Bundle对象捆绑数据,Intent携带Bundle对象
 *       putExtras(Bundle data):向Intent中放入需要“携带”的数据包
 *       Bundle getExtras();取出Intent所“携带”的数据包
 * 2,对于简单的数据类型,可以使用便携的方法直接存,取Intent所携带的Bundle对象,源码里可发现都是先创建的Bundle对象
 *       putExtras(String key,Xxx value);想Intent中按键值对(key-value)的形式存入数据
 *       getXxxExtras(String key);从Intent中按key取出指定类型的数据
 * */
/*
 * Bundle就是一个简单的数据携带包,该Bundle对象包含了多种方法:
 * 1,放入简单的数据类型
 *     putXxx(String key,Xxx value);想Bundle中放入int,Long等简单数据类型
 *     getXxx(String key);取出int,long个中简单的数据类型
 *2,放入可序列化的对象,实现Seriliable接口的对象
 *     putSerializable(String key,Serializable data);想Bundle中放入可序列化的对象
 *     getSerializable(String key);取出可序列化的对象
 * 
 * 一般第一个Activity中:
 *  Bundle放数据用:
 *        putXxx(String key,Xxx value);想Bundle中放入int,Long等简单数据类型
 *        putSerializable(String key,Serializable data);想Bundle中放入可序列化的对象,主要用于放对象
 *  Intent放Bundle用:
 *        putExtras(Bundle data):向Intent中放入需要“携带”的数据包
 *  
 * 被启动的Activity中:
 *   Intent取数据:
 *       Bundle getExtras();取出Intent所“携带”的数据包
 *       getXxxExtras(String key);从Intent中按key取出指定类型的数据,便携方式取Bundle中的数据
 * */
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn=(Button) findViewById(R.id.button1);
          
        btn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//获得的三个组件
				EditText name=(EditText) findViewById(R.id.name);
		        EditText password=(EditText) findViewById(R.id.password);
		        RadioButton male=(RadioButton) findViewById(R.id.radio0);
		        //判断是否被选
		        String sex=(male.isChecked())?"男":"女";
		        //封装成一个对象
		        Person p=new Person(name.getText().toString(),password.getText().toString(),sex);
				//创建Bundle对象
				Bundle bundle=new Bundle();
				bundle.putSerializable("person", p);
				//创建一个Intent对象
				Intent intent=new Intent(MainActivity.this,ResultActivity.class);
				intent.putExtras(bundle);
				//启动intent对应的Activity
				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;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Person.java

package com.hust.bundletest;

import java.io.Serializable;

public class Person implements Serializable {
    String name;
    String password;
    String sex;
	public Person(String name, String password, String sex) {
		super();
		this.name = name;
		this.password = password;
		this.sex = sex;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
    
}

ResultActivity.java
package com.hust.bundletest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class ResultActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_result);
		//获取显示组件
		TextView name=(TextView) findViewById(R.id.text1);
		TextView password=(TextView) findViewById(R.id.text2);
		TextView sex=(TextView) findViewById(R.id.text3);
		//获取Intent对象
		Intent intent=getIntent();
		//从Intent对象中获取序列数据
		//Person p=(Person) intent.getSerializableExtra("person");相当于
		
		Bundle bundle=intent.getExtras();//获取Bundle对象
		Person p=(Person) bundle.getSerializable("person");//Bundle对象中获取可序列化对象
		
		name.setText(p.getName());
		password.setText(p.getPassword());
		sex.setText(p.getSex());
			
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.result, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
技术分享





















以上是关于Bundle在Activity之间交换数据的主要内容,如果未能解决你的问题,请参考以下文章

使用Bundle在Activity中交换数据

android 怎么在activity之间传递List 类型的数据

Activity之间数据传递(简单传递,数据包Bundle)

Android 中使用bundle.putExtra实现Activity之间的参数传递

将数据从Activity发送到Fragment - 如何?

将捆绑数据传递到以viewPager开头的片段