Android手机通讯录制作

要求

设计一个基于Android的手机通讯录,此通讯录包括添加、搜索、修改、删除联系人的功能。

  1. 添加、编辑、删除功能
    点击通讯录主界面选项菜单中的“添加联系人”菜单项,进入添加联系人界面,输入联系人的基本信息,包括姓名、手机号码、家庭地址、单位名称、Email、QQ号这些信息,姓名和手机号码必须不为空,且唯一。点击通讯录中一个已存在的联系人,进入编辑界面,可修改联系人的资料或进行删除操作,完成后返回到主界面。
  2. 查找联系人
    点击通讯录选项菜单中的“查找联系人”菜单项,进入搜索界面,能通过姓名、手机号码、单位名称等信息查找联系人,将所有符合查询条件的联系人通过列表控件显示。
  3. 快捷菜单功能
    在联系人主界面上长按一个已存在的联系人,能弹出一个快捷菜单,菜单项包括拨打电话、发送短信、修改联系人、删除联系人。点击菜单项能跳转到相应的界面。

样图展示

Alt

代码

1.创建数据库

/**
 * 创建一个数据库类继承
 * 通过创建子类MyDatabaseHelper继承SQLiteOpenHelper类,实现它的一些方法来对数据库进行操作。
 * 变量用常量表示规范,常量一般大写
 */
public class MyDatabaseHelper extends SQLiteOpenHelper {

    private Context context;
    private static final String DATABASE_NAME = "phone_contacts.db";//定义一个常量名命这个数据库为phone db是一个扩展;
    private static final int DATABASE_VERSION = 1;//定义一个数据库版本,是一个整数类型;
    private static final String TABLE_NAME = "contact";//定义一个表名;
    //需要定义标题
    private static final String CONTACT_ID = "phone_id";//序列
    private static final String CONTACT_NAME = "phone_name";//名字
    private static final String CONTACT_PHONE = "phone_phone";//电话
    private static final String CONTACT_ADDRESS = "phone_address";//地址
    private static final String CONTACT_UNIT = "phone_unit";//单位名称
    private static final String CONTACT_EMAIL = "phone_email";//Email
    private static final String CONTACT_QQ = "phone_qq";//QQ号码

    /*
    构造函数
    要传上下文和名字以及工厂还有一个版本,
     */
    public MyDatabaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    /*
    第一次创建数据库的时候使用回调方法
    数据出第一次创建的时候才会被调用,其他时候不会再调用了,只调用一次
    创建contact表
    id,name,phone,address,unit,,email,qq;
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据表
        String query =
                " CREATE TABLE " + TABLE_NAME +
                        " ( " + CONTACT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        CONTACT_NAME + " TEXT, " +
                        CONTACT_PHONE + " TEXT, " +
                        CONTACT_ADDRESS + " TEXT, " +
                        CONTACT_UNIT + " TEXT, " +
                        CONTACT_EMAIL + " TEXT, " +
                        CONTACT_QQ + " TEXT); ";
        //执行SQL
        db.execSQL(query);
    }

## 如何插入一段漂亮的代码片

去[博客设置](https://mp.csdn.net/console/configBlog)页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 `代码片`.
```javascript
// An highlighted block
var foo = 'bar';

2.主界面

MainActivity
public class MainActivity extends AppCompatActivity {
    private SearchView searchView;
/*
创建一个RecoverySystem对象和浮动操作按钮
 */
    RecyclerView recyclerView;
    FloatingActionButton add_button;
    //初始化我的数据库类
    MyDatabaseHelper myDB = new MyDatabaseHelper(MainActivity.this);
    //创建6个不同的数组列表一边这些数组列表将包含字符串,因此第一个是
    //phone_id、phone_name、phone_phone、phone_address、phone_unit、phone_email、phone_qq
    ArrayList<String> phone_id,phone_name,phone_phone,phone_address,phone_unit,phone_email,phone_qq;
    CustomAdapter customAdapter;
    CardView cardView;
@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){
        super.onActivityResult(requestCode,resultCode,data);
        if (requestCode == 1){
            recreate();
        }
    }
    public void displayData(){
        Cursor cursor = myDB.readAllData();
        if (cursor.getCount() == 0){
            Toast.makeText(this, "没有数据可以显示", Toast.LENGTH_SHORT).show();
        }else{
            while (cursor.moveToNext()){
                phone_id.add(cursor.getString(0));
                phone_name.add(cursor.getString(1));
                phone_phone.add(cursor.getString(2));
                phone_address.add(cursor.getString(3));
                phone_unit.add(cursor.getString(4));
                phone_email.add(cursor.getString(5));
                phone_qq.add(cursor.getString(6));
            }
        }
    }
 }
CustomAdapter.java

创建适配器界面用于显示主页面数据

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
    private Context context;
    Activity activity;
    EditText pt_name1, pt_phone1, pt_address1, pt_unit1, pt_email1, pt_qq1;
    private ArrayList phone_id, phone_name, phone_phone, phone_address,
            phone_unit, phone_email, phone_qq;

    CustomAdapter(Activity activity,
                  Context context,
                  ArrayList phone_id,
                  ArrayList phone_name,
                  ArrayList phone_phone,
                  ArrayList phone_address,
                  ArrayList phone_unit,
                  ArrayList phone_email,
                  ArrayList phone_qq) {
        this.activity = activity;
        this.context = context;
        this.phone_id = phone_id;
        this.phone_name = phone_name;
        this.phone_phone = phone_phone;
        this.phone_address = phone_address;
        this.phone_unit = phone_unit;
        this.phone_email = phone_email;
        this.phone_qq = phone_qq;
    }

 @Override
    public int getItemCount() {
        return phone_id.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView phone_id_txt, phone_name_txt, phone_phone_txt, phone_address_txt;
        LinearLayout mainLayout;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            phone_id_txt = itemView.findViewById(R.id.phone_id_txt);
            phone_name_txt = itemView.findViewById(R.id.phone_name_txt);
            phone_phone_txt = itemView.findViewById(R.id.phone_phone_txt);
            phone_address_txt = itemView.findViewById(R.id.phone_address_txt);
            pt_name1 = itemView.findViewById(R.id.pt_name1);
            pt_phone1 = itemView.findViewById(R.id.pt_phone1);
            pt_address1 = itemView.findViewById(R.id.pt_address1);
            pt_unit1 = itemView.findViewById(R.id.pt_unit1);
            pt_email1 = itemView.findViewById(R.id.pt_email1);
            pt_qq1 = itemView.findViewById(R.id.pt_qq1);
            mainLayout = itemView.findViewById(R.id.mainLayout);
        }
    }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="414dp"
        android:layout_height="674dp"
        android:layout_marginTop="52dp"

        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.666"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add_button"
        android:layout_width="57dp"
        android:layout_height="55dp"
        android:layout_marginEnd="44dp"
        android:layout_marginBottom="84dp"
        android:clickable="true"
        android:focusable="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:srcCompat="@drawable/ic_baseline_add_24" />

    <SearchView
        android:id="@+id/searchview"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="2dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

3.添加联系人

//创建一个添加方法addPhone()
    //将创建SQLite数据库对象,这样只需要名命该数据库,使用一个关键字,指向SQLite开放式帮助类
    //helper类,获取可写入的数据库
    public void addPhone(String name, String phone, String address, String unit, String email, String qq) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(CONTACT_NAME, name);
        cv.put(CONTACT_PHONE, phone);
        cv.put(CONTACT_ADDRESS, address);
        cv.put(CONTACT_UNIT, unit);
        cv.put(CONTACT_EMAIL, email);
        cv.put(CONTACT_QQ, qq);
        long result = db.insert(TABLE_NAME, null, cv);
        if (result == -1) {
            Toast.makeText(context, "保存失败", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "保存成功!", Toast.LENGTH_SHORT).show();
        }
    }
AddContacts.java(添加界面)
public class AddContacts extends AppCompatActivity {
    private EditText et_name,et_phone,et_address,et_unit,et_email,et_qq;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_contacts);
        init();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyDatabaseHelper myDB = new MyDatabaseHelper(AddContacts.this);
                myDB.addPhone(et_name.getText().toString().trim(),
                        et_phone.getText().toString().trim(),
                        et_address.getText().toString().trim(),
                        et_unit.getText().toString().trim(),
                        et_email.getText().toString().trim(),
                        et_qq.getText().toString().trim());
            }
        });
    }

    private void init(){
        et_name = findViewById(R.id.pt_name);
        et_phone = findViewById(R.id.pt_phone);
        et_address = findViewById(R.id.pt_address);
        et_unit = findViewById(R.id.pt_unit);
        et_email = findViewById(R.id.pt_email);
        et_qq = findViewById(R.id.pt_qq);
        button = findViewById(R.id.button);
    }
}
addactivity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AddContacts">

    <EditText
        android:id="@+id/pt_name"
        android:layout_width="250dp"
        android:layout_height="40dp"
        android:layout_marginTop="150dp"
        android:ems="10"
        android:hint="请输入姓名"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.683"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/pt_phone"
        android:layout_width="250dp"
        android:layout_height="40dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="请输入电话号码"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.689"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pt_name" />

    <EditText
        android:id="@+id/pt_address"
        android:layout_width="250dp"
        android:layout_height="40dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="请输入家庭地址"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.689"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pt_phone" />

    <EditText
        android:id="@+id/pt_unit"
        android:layout_width="250dp"
        android:layout_height="40dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="请输入单位名称"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.683"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pt_address" />

    <EditText
        android:id="@+id/pt_email"
        android:layout_width="250dp"
        android:layout_height="40dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="请输入Email"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.683"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pt_unit" />

    <EditText
        android:id="@+id/pt_qq"
        android:layout_width="250dp"
        android:layout_height="40dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="请输入QQ号码"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.683"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/pt_email" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="150dp"
        android:layout_marginEnd="15dp"
        android:gravity="center"
        android:text="@string/tv_name"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/pt_name"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:gravity="center"
        android:layout_marginStart="16dp"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="15dp"
        android:text="@string/tv_phone"
        android:textAlignment="center"
        android:textDirection="locale"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/pt_phone"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_marginStart="16dp"
        android:gravity="center"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="15dp"
        android:text="@string/tv_address"
        android:textAlignment="center"
        android:textDirection="locale"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/pt_address"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="30dp"
        android:gravity="center"
        android:layout_marginEnd="15dp"
        android:text="@string/tv_unit"
        android:textAlignment="center"
        android:textDirection="locale"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/pt_unit"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="15dp"
        android:gravity="center"
        android:text="@string/tv_email"
        android:textAlignment="center"
        android:textDirection="locale"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/pt_email"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView4" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="15dp"
        android:gravity="center"
        android:text="@string/tv_QQ"
        android:textAlignment="center"
        android:textDirection="locale"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/pt_qq"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView5" />

    <Button
        android:id="@+id/button"
        android:layout_width="400dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="56dp"
        android:text="@string/btn_button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.454"
        app:layout_constraintStart_toStartOf="parent" />

    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="360dp"
        android:layout_height="142dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.509"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/qq1" />
</androidx.constraintlayout.widget.ConstraintLayout>

  • 10
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绝对的摆烂王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值