AndroidStudio移动应用开发第七次实验:开发手机电话号码簿

《移动应用开发》课程

第七次实验

1、在Android Studio中,完成以下功能。

 5b350bb09c394e09b679131a6f7e9224.png

图-1 联系人列表          图-2 添加联系人        图-3 联系人详情

请开发手机电话号码簿。在默认页面中,按照图-1方式展示页面内容,要求所有的信息均是从SQLite中进行获取,具体包括:

(1)联系人数量;

(2)联系人的姓名。

联系人姓名可以使用全英文方式(本项目支持中文),要求按照首字母进行分组。联系人数量在20人以上,联系人分组要求在4组以上。

联系人图标采用预先设置的图片库进行加载,并允许用户进行选取更换其他图标(参见课件中相关Demo)。

点击联系人列表上方的搜索栏后,显示搜索页面(请自行设计页面布局效果),在输入检索关键字后,查询联系人信息,并以列表方式显示。

点击联系人列表条目(包括经过检索返回的联系人列表),对应跳转到联系人详情页面(参见图-3),当用户对应点击号码条目对应的“拨打电话”、“视频电话”、“发送信息”按钮,采用Toast方式显示对应的功能,即Dial number,Video call,Send message(本项目跳转到相应的活动页面)。

点击图-1中的“+”(添加)按钮,跳转到添加联系人信息页面(参见图-2),为用户提供添加联系人信息(包括姓名、电话号码、电子信箱、备注、单位信息)和头像信息。保存后,将信息存储到数据库中,并相应更新联系人列表的显示内容。

运行效果:

27ed5a6ac81a44b787e288627c20ed39.gif

搜索功能

80ab9ddc99f7478ab0614852f7c070c3.gif

文件目录 :

4708132f956945c286318c3175c95b85.png

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值