2014-10-25Android学习--------activity之间批量传递数据----Bundle类的实现

我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的个HealthFood 源码 百度搜就知道很多下载的地方

本篇学习需要结合前面写的几篇文章,

布局学习(三) 地址:http://blog.csdn.net/u014737138/article/details/40480291

布局学习(四) 地址:http://blog.csdn.net/u014737138/article/details/40508845

SimpleAdapter的实现 http://blog.csdn.net/u014737138/article/details/40481965


简单来说这篇文章要重点学习的就是 :

当应用程序从一个activity A跳转到另一activity B,B是怎么接受从A中传递过来的数据呢?

这就相当于activity之间的数据的通信吧,信息的传递


方法是:使用Bundle类


根据前面的学习中可以看到,从ListView界面中,当我们点击每一行的item的时候,页面就应该要跳转到另外一个界面中去,并且我们看到的图片恰好是上面传递过来的,值也应该是根据上面用户选择的item动态设置的,这就导致了activity之间的数据传递。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.wust.healthfood.R;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class FoodInfo extends ListActivity {
	
	Button image=null;
	Button back=null;
	TextView foodinfo=null;
	String[] efood={"黄连"};
	String [] efoodinfo={"猪肉多脂,酸寒滑腻。若中药配方中以黄莲为主时,应忌食猪肉,不然会降低药效,且容易引起腹泻。"};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.foodinfo);
		// 得到传递过来的值
		Bundle bundle = getIntent().getExtras();
		// 解析得到的值
		int drawable=bundle.getInt("drawable");		
		String foodname=bundle.getString("foodname");
		String efoodname=bundle.getString("efoodnema");
		String foodinfos=bundle.getString("foodinfo");
		
		image = (Button) this.findViewById(R.id.Button);
		image.setBackgroundResource(drawable);
		image.setText(foodname);
		
		foodinfo=(TextView)findViewById(R.id.TextView03);
		foodinfo.setText(foodinfos);
		
		back=(Button)findViewById(R.id.backbutton);
		back.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Button b=(Button)v;
				b.setBackgroundResource(R.drawable.btn_back_active);
				Intent intent=new Intent(FoodInfo.this, FoodListView.class);
				startActivity(intent);
			}
		});
		
		List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();
		for(int i=0;i<efood.length;i++){
			Map<String, Object> map=new HashMap<String, Object>();
			map.put("TextView04", efood[i]);
			map.put("TextView05", efoodinfo[i]);
			data.add(map);
		}
		
		SimpleAdapter adapter=new SimpleAdapter(this, data, R.layout.ex_foodinfo,new String[]{"TextView04","TextView05"} , new int[]{R.id.TextView04,R.id.TextView05});
		setListAdapter(adapter);
		
		
	}
	
	

}

剖析代码:

当设定了界面的时候,我们定义一个Bundle对象:

1. // 得到传递过来的值
Bundle bundle = getIntent().getExtras();

//getIntent()能够得到activity传递过来的意图(Intent) 对象,然后调用getExtras()函数,我们能得到传递过来的批量数据,注意了,这个数据它是继承Map的,

 

Intent android. app. Activity.getIntent()   // 这个能很好的让我们明白getIntent()的返回值时什么,谁来调用它
Bundle android . content . Intent .getExtras()//这个能很好的让我们明白getExtras()的返回值是什么,谁来调用

下面我们就需要对Bundle类进行分析了,

我们看下文档中是如何介绍Bundle的:

它是一个map,这个map的定义是:从一个字符串String映射不同Parcelable类型。

其他的我们先不管,我们可以知道的就是这个对象是一个map,里面的键值都是String类型
这跟前面我们创建的List<Map<String,Object>> lists数组的元素是一致的就可以了。

接下来我们就是如何取出里面的值就可以了,我们再来看看文档中有没有get类型的函数,找到了:

这个get(String key)函数的作用就是根据给定的键值字符串,返回一个对象实体类,那么就Ok了,就可以这样处理了。

再来看看代码:
// 解析得到的值
int drawable=bundle.getInt("drawable");
String foodname=bundle.getString("foodname");
String efoodname=bundle.getString("efoodnema");
String foodinfos=bundle.getString("foodinfo");

做到这里就很清楚的知道了,我们依据指定的字符串可以得到我们需要的数据信息
但是我们还忽略了一点,就是我传递过来的数据是怎么设定的呢?
我们还是看看前面的代码了:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
for (int j = 0; j < efood.length; j++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put(efood[j], efoodinfo[j]);
data.add(map);
}
// 参数position就是item所在的行数,非常关键的一个参数
Intent intent = new Intent();//申明一个意图
intent.setClass(FoodListView.this, FoodInfo.class);
intent.putExtra("drawable", resId[position]);//intent里面放置第一个数据,键值为String=drawable,值为resId[position]
intent.putExtra("foodname", food[position]);//intent里面放第二个数据,键值为String=foodname,值为food[position]
intent.putExtra("efoodnema", food1[position]);//intent里面放置第三个数据,键值为String=efoodname,值为food1[ ]
intent.putExtra("foodinfo", foodjianjie[position]);//intent里面放置第四个数据,键值为String=foodinfo,值为.....
startActivity(intent);//激活意图,页面跳转

}  
上面的代码正是通过这些键值取出相应的值


分析到这里,就完美的解决了activity之间数据传递的问题,

总结:

1.A是怎么传递数据过来的:

首先定义一个意图,Intent intent = new Intent();

其次 设置传递的数据:利用intent.putExtra(Key,Value);,如果是批量数据,就用for循环来设定

2.B是怎么取得数据的:

首先定义一个Bundle对象,利用getIntent().getExtras()来生成一个bundle对象

其次取数据,利用bundle.get(String key)来获取传递过来的值


接下来在分析其他的代码了:


image = (Button) this.findViewById(R.id.Button);// 找到布局视图中的子相对布局的按钮控件,这个按钮是用图片来设置的
image.setBackgroundResource(drawable);//设置按钮控件的背景图片
image.setText(foodname);//设置按钮的内容


foodinfo=(TextView)findViewById(R.id.TextView03);//找到按钮右边的文本显示控件
foodinfo.setText(foodinfos);//设置文本内容


back=(Button)findViewById(R.id.backbutton);//找到返回按钮控件
back.setOnClickListener(new OnClickListener() {//返回按钮的监听事件

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Button b=(Button)v;//注意这里的参数,在Android系统中,所有的widget都可以看做是一个View对象
b.setBackgroundResource(R.drawable.btn_back_active);//设置按钮的背景图片
Intent intent=new Intent(FoodInfo.this, FoodListView.class);//返回到上一个界面也是用Intent意图
startActivity(intent);
}
});


至此  所有的代码就完全解决了,接下来还有一个清单文件没有学习:

要想这些activity被执行,必须在清单文件中进行定义的,否则程序是找不到的:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wust.healthfood"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.wust.healthfood.activity.MainApp"
            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.wust.healthfood.activity.FoodListView"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.wust.healthfood.activity.About"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.wust.healthfood.activity.FoodInfo"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>


关于清单文件下篇文章继续介绍


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值