我学习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的,
它是一个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>
关于清单文件下篇文章继续介绍
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有