《移动应用开发》课程
第七次实验
1、在Android Studio中,完成以下功能。
图-1 联系人列表 图-2 添加联系人 图-3 联系人详情
请开发手机电话号码簿。在默认页面中,按照图-1方式展示页面内容,要求所有的信息均是从SQLite中进行获取,具体包括:
(1)联系人数量;
(2)联系人的姓名。
联系人姓名可以使用全英文方式(本项目支持中文),要求按照首字母进行分组。联系人数量在20人以上,联系人分组要求在4组以上。
联系人图标采用预先设置的图片库进行加载,并允许用户进行选取更换其他图标(参见课件中相关Demo)。
点击联系人列表上方的搜索栏后,显示搜索页面(请自行设计页面布局效果),在输入检索关键字后,查询联系人信息,并以列表方式显示。
点击联系人列表条目(包括经过检索返回的联系人列表),对应跳转到联系人详情页面(参见图-3),当用户对应点击号码条目对应的“拨打电话”、“视频电话”、“发送信息”按钮,采用Toast方式显示对应的功能,即Dial number,Video call,Send message(本项目跳转到相应的活动页面)。
点击图-1中的“+”(添加)按钮,跳转到添加联系人信息页面(参见图-2),为用户提供添加联系人信息(包括姓名、电话号码、电子信箱、备注、单位信息)和头像信息。保存后,将信息存储到数据库中,并相应更新联系人列表的显示内容。
运行效果:
搜索功能
文件目录 :
AddContactActivity.java
package com.example.theseventhexperiment;
// 导入必要的包
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.*;
import androidx.appcompat.app.AppCompatActivity;
import java.util.*;
public class AddContactActivity extends AppCompatActivity implements View.OnClickListener {
// 声明UI组件
private ImageButton ib_back;
private Button btn_tianjia;
private EditText et_xingming, et_dianhuahaoma, et_dianziyoujian, et_beizhu, et_danweixinxi;
private Spinner spinner;
// 声明数据变量
private String name, e_mail, remark, unit_information, number, avatar, from;
private int id;
private Integer selectedImageResource;
private UserDBHelper mHelper;
private List<Map<String, Integer>> data; // 使用Integer类型,因为资源ID是整数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_contact);
// 初始化视图组件
initView();
// 设置监听器
setListener();
// 获取传递过来的数据
getValue();
// 设置视图内容
setView();
// 初始化并设置Spinner适配器
setupSpinner();
}
// 初始化视图组件
private void initView() {
ib_back = findViewById(R.id.ib_back);
btn_tianjia = findViewById(R.id.btn_tianjia);
et_xingming = findViewById(R.id.et_xingming);
et_dianhuahaoma = findViewById(R.id.et_dianhuahaoma);
et_dianziyoujian = findViewById(R.id.et_dianziyoujian);
et_beizhu = findViewById(R.id.et_beizhu);
et_danweixinxi = findViewById(R.id.et_danweixinxi);
spinner = findViewById(R.id.spinner_contact_icon);
}
// 设置监听器
private void setListener() {
ib_back.setOnClickListener(this);
btn_tianjia.setOnClickListener(this);
}
// 获取传递过来的数据
private void getValue() {
from = getIntent().getStringExtra("from");
if ("edit".equals(from)) {
id = getIntent().getIntExtra("id", 0);
name = getIntent().getStringExtra("name");
number = getIntent().getStringExtra("number");
avatar = getIntent().getStringExtra("avatar");
e_mail = getIntent().getStringExtra("e-mail");
remark = getIntent().getStringExtra("remark");
unit_information = getIntent().getStringExtra("unit_information");
// 对可能为null的字符串进行默认值处理
if (e_mail == null) e_mail = "无";
if (remark == null) remark = "无";
if (unit_information == null) unit_information = "无";
}
}
// 设置视图内容
private void setView() {
if ("edit".equals(from)) {
et_xingming.setText(name);
et_dianhuahaoma.setText(number);
et_dianziyoujian.setText(e_mail);
et_beizhu.setText(remark);
et_danweixinxi.setText(unit_information);
}
}
// 初始化并设置Spinner适配器
private void setupSpinner() {
// 准备数据
data = getListData();
// 创建SimpleAdapter并设置给Spinner
SimpleAdapter simpleAdapter = new SimpleAdapter(
this,
data,
R.layout.spinner_item, // 自定义布局
new String[]{"touxiang"}, // 数据源中的键
new int[]{R.id.imageView} // 布局中的ID
);
spinner.setAdapter(simpleAdapter);
// 设置Spinner选择监听器
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// 获取选中的项并设置给selectedImageResource
Map<String, Integer> selectedItem = (Map<String, Integer>) parent.getItemAtPosition(position);
selectedImageResource = selectedItem.get("touxiang");
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// 不执行任何操作
}
});
}
// 获取Spinner列表数据
private List<Map<String, Integer>> getListData() {
List<Map<String, Integer>> list = new ArrayList<>();
int[] touxiangResources = {
R.drawable.touxiang1, R.drawable.touxiang2, R.drawable.touxiang3,
R.drawable.touxiang4, R.drawable.touxiang5, R.drawable.touxiang6
};
for (int resource : touxiangResources) {
Map<String, Integer> item = new HashMap<>();
item.put("touxiang", resource);
// 如果是编辑模式且当前资源是选中的头像,则将其添加到列表的开头
if ("edit".equals(from) && resource == Integer.parseInt(avatar)) {
list.add(0, item);
} else {
list.add(item);
}
}
return list;
}
// 数据库帮助器的初始化与关闭
@Override
protected void onStart() {
super.onStart();
mHelper = UserDBHelper.getInstance(this);
mHelper.getReadableDatabase(); // 通常不需要显式调用,除非需要立即访问
mHelper.getWritableDatabase(); // 同上
}
@Override
protected void onStop() {
super.onStop();
if (mHelper != null) {
mHelper.close();
}
}
// 点击事件处理
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ib_back:
finish();
break;
case R.id.btn_tianjia:
// 获取输入框内容并进行校验
String et_name = et_xingming.getText().toString().trim();
String et_phone = et_dianhuahaoma.getText().toString().trim();
String et_email = et_dianziyoujian.getText().toString().trim();
String et_remark = et_beizhu.getText().toString().trim();
String et_unitInfo = et_danweixinxi.getText().toString().trim();
// 对空值或无效输入进行处理
if (TextUtils.isEmpty(et_name)) {
Toast.makeText(this, "请输入姓名", Toast.LENGTH_SHORT).show();
} else if (TextUtils.isEmpty(et_phone) || !et_phone.matches("\\d+")) {
Toast.makeText(this, "请输入有效的电话号码", Toast.LENGTH_SHORT).show();
} else {
// 创建联系人对象并保存
Contacter contacter = new Contacter(
et_name, et_phone, et_email, et_remark, et_unitInfo,
selectedImageResource != null ? selectedImageResource.toString() : null
);
if ("edit".equals(from)) {
// 更新联系人
if (mHelper.updateContact(id, contacter) > 0) {
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
finish();
} else {
Toast.makeText(this, "修改失败", Toast.LENGTH_SHORT).show();
}
} else if ("add".equals(from)) {
// 添加联系人
if (mHelper.insert(contacter) > 0) {
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
finish();
} else {
Toast.makeText(this, "添加失败", Toast.LENGTH_SHORT).show();
}
}
}
break;
default:
break;
}
}
}
Contacter.java
package com.example.theseventhexperiment;
public class Contacter {
public int id;
public String name;
public String phonenumber;//存储电话号码
public String e_mail;
public String remark;
public String unit_information;
public String avatar;//存储头像资源id
public String beginZ;//第一个字母
public Contacter(int id, String name, String phonenumber, String e_mail, String remark, String unit_information, String avatar, String beginZ) {
this.id = id;
this.name = name;
this.phonenumber = phonenumber;
this.e_mail = e_mail;
this.remark = remark;
this.unit_information = unit_information;
this.avatar = avatar;
this.beginZ = beginZ;
}
public Contacter(String name, String phonenumber, String e_mail, String remark, String unit_information, String avatar) {
this.name = name;
this.phonenumber = phonenumber;
this.e_mail = e_mail;
this.remark = remark;
this.unit_information = unit_information;
this.beginZ = beginZ;
this.avatar = avatar;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhonenumber() {
return phonenumber;
}
public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
public String getE_mail() {
return e_mail;
}
public void setE_mail(String e_mail) {
this.e_mail = e_mail;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getUnit_information() {
return unit_information;
}
public void setUnit_in