前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2014-10-25Android学习--------activity之间批量传递数据----Bundle类的实现

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

作者头像
wust小吴
发布于 2022-03-07 00:28:07
发布于 2022-03-07 00:28:07
67500
代码可运行
举报
文章被收录于专栏:风吹杨柳风吹杨柳
运行总次数:0
代码可运行

我学习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之间的数据传递。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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被执行,必须在清单文件中进行定义的,否则程序是找不到的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验