介绍
多个Activity之间交换数据
当在一个 Activity 中启动另一个 Activity 时,经常需要传递一些数据。这时就可以通过 Intent来实现,因为 Intent 通常被称为是两个 Activity 之间的信使,通过将要传递的数据保存在 Intent 中,就可以将其传递到另一个 Activity 中了。在 Android 中,可以将要保存的数据存放在 Bundle 对象中,然后通过 Intent 提供的 putExtras() 方法将要携带的数据保存到 Intent 中。通过 Intent 传递数据的示意图如图 9.16 所示。
Bundle是一个key-value(键-值)对的组合,用于保存要携带的数据包。这些数据可以是boolean、byte、int、long、float、double和String等基本类型或者对应的数组,也可以是对象或者对象数组。如果是对象或者对象数组时,必须实现Serializable或者Parcelable接口。
调用另一个Activity并返回结果
在 Android 应用开发时,有时需要在一个 Activity 中调用另一个 Activity,当用户在第二个Activity 中选择完成后,程序将自动返回到第一个 Activity 中,第一个 Activity 能够获取并显示用户在第二个 Activity 中选择的结果。例如,用户在修改信息的时候可以对头像进行修改,在修改头像时首先需要调用选择头像的界面,效果如图 9.19 所示。在选择头像后会自动返回到修改信息界面,并显示用户选择的新头像,效果如图 9.20 所示。
此功能也可以通过 Intent 和 Bundle 来实现。与在两个 Activity 之间交换数据不同的是,此处需要使用startActivityForResult()方法来启动另一个Activity。调用startActivityForResult()方法启动Activity后,关闭新启动的 Activity 时,可以将选择的结果返回到原 Activity 中。startActivityForResult() 方法的语法格式如下:
public void startActivityForResult (Intent intent, int requestCode)
该方法将以指定的请求码启动 Activity,并且程序将会获取新启动的 Activity 返回的结果(通过重写 onActivityResult() 方法来获取)。requestCode 参数代表了启动 Activity 的请求码,该请求码的值由开发者根据业务自行设置,用于标识请求来源。
生命周期
A活动 | B活动 |
onCreate | |
onStart(可见) | |
onResume(获得焦点) | |
跳转到B活动 | |
onPause(失去焦点) | |
onCreate | |
onStart | |
onResume | |
onStop(不可见) | |
onSaveInstanceState | |
结束B活动 | |
onPause | |
onRestart | |
onStart | |
onResume | |
onStop | |
onDestory |
savedInstanceState,字面上是保存实例状态的,实际上也就是保存Activity的状态的,在上面实验中可以看出是在活动不可见时调用以下方法,将状态数据以key-value的形式放入到outState中。
@Override
protected void onSaveInstanceState( Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG,"A:onSaveInstanceState");
}
相关方法及配置属性
- startActicity()开启一个新活动
- finish()关闭活动
- android:name:指定对应的 Activity 实现类。
- android:label:为该 Activity 指定标签。
- android:theme:设置要应用的主题。
1.如果该Activity类在<manifest>标记的package属性指定的包中,则android:name属性的属性值可以直接写类名,也可以是“.类名”的形式;
2.如果在package属性指定包的子包中,则属性值需要设置为“.子包序列.类名”或者是完整的类名(包括包路径)
例子
模拟保存淘宝收货地址
编写activity_tao_bao_edit布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical"
tools:context=".general.TaoBaoEditActivity">
<EditText
android:id="@+id/et_site1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textColor="@color/black"
android:textSize="16sp"
android:hint="输入所在地区"
android:padding="10dp"
android:background="@drawable/bg_username"
android:drawablePadding="15dp"
android:maxLines="1"
android:layout_marginTop="50dp"/>
<EditText
android:id="@+id/et_site2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textColor="@color/black"
android:textSize="16sp"
android:hint="输入所在街道"
android:padding="10dp"
android:background="@drawable/bg_username"
android:drawablePadding="15dp"
android:maxLines="1"
android:layout_marginTop="10dp"/>
<EditText
android:id="@+id/et_site3"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textColor="@color/black"
android:textSize="16sp"
android:hint="输入详细地址"
android:padding="10dp"
android:background="@drawable/bg_username"
android:drawablePadding="15dp"
android:maxLines="1"
android:layout_marginTop="10dp"/>
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textColor="@color/black"
android:textSize="16sp"
android:hint="输入用户姓名"
android:padding="10dp"
android:background="@drawable/bg_username"
android:drawablePadding="15dp"
android:maxLines="1"
android:layout_marginTop="10dp"/>
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textColor="@color/black"
android:textSize="16sp"
android:hint="输入手机号码"
android:padding="10dp"
android:background="@drawable/bg_username"
android:drawablePadding="15dp"
android:maxLines="1"
android:layout_marginTop="10dp"/>
<EditText
android:id="@+id/et_email"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textColor="@color/black"
android:textSize="16sp"
android:hint="输入用户邮箱"
android:padding="10dp"
android:background="@drawable/bg_username"
android:drawablePadding="15dp"
android:maxLines="1"
android:layout_marginTop="10dp"/>
<Button
android:id="@+id/btn_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="保存"
android:textSize="20sp"
android:textColor="#FFFFFF"
android:background="@drawable/bg_btn4"
android:layout_marginTop="10dp"/>
</LinearLayout>
编写TaoBaoEditActivity
public class TaoBaoEditActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tao_bao_edit);
Button btn = (Button) findViewById(R.id.btn_save); //获取保存按钮
btn.setOnClickListener(new View.OnClickListener() { //为按钮添加单击监听事件
@Override
public void onClick(View v) {
//获取输入的所在地区
String site1 = ((EditText) findViewById(R.id.et_site1)).getText().toString();
//获取输入的所在街道
String site2 = ((EditText) findViewById(R.id.et_site2)).getText().toString();
//获取输入的详细地址
String site3 = ((EditText) findViewById(R.id.et_site3)).getText().toString();
//获取输入的用户信息
String name = ((EditText) findViewById(R.id.et_name)).getText().toString();
//获取输入的手机号码
String phone = ((EditText) findViewById(R.id.et_phone)).getText().toString();
//获取输入的邮箱
String email= ((EditText) findViewById(R.id.et_email)).getText().toString();
if (!"".equals(site1) && !"".equals(site2) && !"".equals(site3)&&
!"".equals(name) && !"".equals(phone) &&!"".equals(email) ) {
Intent intent = new Intent(TaoBaoEditActivity.this,
TaoBaoInfoActivity.class);
Bundle bundle = new Bundle();
bundle.putCharSequence("name", name); //保存姓名
bundle.putCharSequence("phone", phone); //保存手机号码
bundle.putCharSequence("email", email); //保存邮箱
bundle.putCharSequence("site1", site1); //保存所在地区信息
bundle.putCharSequence("site2", site2); //保存所在街道信息
bundle.putCharSequence("site3", site3); //保存详细地址信息
intent.putExtras(bundle); //将Bundle对象添加到Intent对象中
startActivity(intent);
}else {
Toast.makeText(TaoBaoEditActivity.this,
"请将收货地址填写完整!",Toast.LENGTH_SHORT).show();
}
}
});
}
}
编写activity_tao_bao_info布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical"
tools:context=".general.TaoBaoInfoActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="收货人:"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_name"
android:text="无"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电话号码:"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true" />
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_phone"
android:text="无"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:id="@+id/tv_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="邮箱:"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true" />
<TextView
android:id="@+id/email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_email"
android:text="无"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:id="@+id/tv_site"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="地址:"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true" />
<TextView
android:id="@+id/site"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_site"
android:text="无"
android:textColor="#000000"
android:textSize="24sp"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"/>
</RelativeLayout>
</LinearLayout>
编写TaoBaoInfoActivity
public class TaoBaoInfoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tao_bao_info);
Intent intent = getIntent(); //获取Intent对象
Bundle bundle = intent.getExtras(); //获取传递的Bundle信息
TextView name = (TextView) findViewById(R.id.name);
name.setText(bundle.getString("name"));
TextView phone = (TextView) findViewById(R.id.phone);
phone.setText(bundle.getString("phone"));
TextView email = (TextView) findViewById(R.id.email);
email.setText(bundle.getString("email"));
TextView site = (TextView) findViewById(R.id.site);
site.setText(bundle.getString("site1")
+ bundle.getString("site2") + bundle.get("site3"));
}
}
效果
模拟选择头像功能
编写activity_head_info布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".general.HeadInfoActivity">
<ImageView
android:id="@+id/iv_Head"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:src="@drawable/img01"
android:scaleType="centerCrop" />
<Button
android:id="@+id/btn_HeadSelect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_Head"
android:layout_centerHorizontal="true"
android:text="选择头像"
android:textSize="20sp"
android:textColor="#FFFFFF"
android:background="@drawable/bg_btn4"
android:layout_marginTop="10dp"/>
</RelativeLayout>
编写HeadInfoActivity
public class HeadInfoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_head_info);
Button button= (Button) findViewById(R.id.btn_HeadSelect);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(HeadInfoActivity.this,
HeadSelectActivity.class);
//requestCode:0x11
startActivityForResult(intent, 0x11);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0x11 && resultCode==0x11){ //判断是否为待处理的结果
Bundle bundle=data.getExtras(); //获取传递的数据包
int imageId=bundle.getInt("imageId"); //获取选择的头像ID
//获取布局文件中添加的ImageView组件
ImageView iv=(ImageView)findViewById(R.id.iv_Head);
iv.setImageResource(imageId); //显示选择的头像
}
}
}
编写activity_head_select布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".general.HeadSelectActivity">
<GridView
android:id="@+id/gv_HeadSelect"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:horizontalSpacing="3dp"
android:verticalSpacing="3dp"
android:numColumns="4">
</GridView>
</RelativeLayout>
编写HeadSelectActivity
public class HeadSelectActivity extends AppCompatActivity {
//定义并初始化保存头像id的数组
public int[] imageId = new int[]{
R.drawable.img01, R.drawable.img02,
R.drawable.img03, R.drawable.img04,
R.drawable.img05
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_head_select);
GridView gridview = (GridView) findViewById(R.id.gv_HeadSelect);
gridview.setAdapter(adapter);
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = getIntent();
Bundle bundle = new Bundle();
//显示选中的图片
bundle.putInt("imageId", imageId[position]);
intent.putExtras(bundle);
//设置返回的resultCode:0x11,并返回调用该Activity的Activity
setResult(0x11, intent);
finish();
}
});
}
BaseAdapter adapter=new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageview;
if(convertView==null){
imageview=new ImageView(HeadSelectActivity.this);
/*************设置图像的宽度和高度******************/
imageview.setAdjustViewBounds(true);
imageview.setMaxWidth(158);
imageview.setMaxHeight(150);
/**************************************************/
imageview.setPadding(5, 5, 5, 5); //设置ImageView的内边距
}else{
imageview=(ImageView)convertView;
}
imageview.setImageResource(imageId[position]); //为ImageView设置要显示的图片
return imageview; //返回ImageView
}
/*
* 功能:获得当前选项的ID
*/
@Override
public long getItemId(int position) {
return position;
}
/*
* 功能:获得当前选项
*/
@Override
public Object getItem(int position) {
return position;
}
/*
* 获得数量
*/
@Override
public int getCount() {
return imageId.length;
}
};
}
效果