Android手机通讯录制作
- 要求
- 样图展示
- 代码
- 1.创建数据库
- 2.主界面
- MainActivity
- CustomAdapter.java
- activity_main.xml
- 3.添加联系人
- AddContacts.java(添加界面)
- addactivity.xml
要求
设计一个基于Android的手机通讯录,此通讯录包括添加、搜索、修改、删除联系人的功能。
- 添加、编辑、删除功能
点击通讯录主界面选项菜单中的“添加联系人”菜单项,进入添加联系人界面,输入联系人的基本信息,包括姓名、手机号码、家庭地址、单位名称、Email、QQ号这些信息,姓名和手机号码必须不为空,且唯一。点击通讯录中一个已存在的联系人,进入编辑界面,可修改联系人的资料或进行删除操作,完成后返回到主界面。 - 查找联系人
点击通讯录选项菜单中的“查找联系人”菜单项,进入搜索界面,能通过姓名、手机号码、单位名称等信息查找联系人,将所有符合查询条件的联系人通过列表控件显示。 - 快捷菜单功能
在联系人主界面上长按一个已存在的联系人,能弹出一个快捷菜单,菜单项包括拨打电话、发送短信、修改联系人、删除联系人。点击菜单项能跳转到相应的界面。
样图展示
代码
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";//Emailprivate 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;*/@Overridepublic 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); ";//执行SQLdb.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_qqArrayList<String> phone_id,phone_name,phone_phone,phone_address,phone_unit,phone_email,phone_qq;CustomAdapter customAdapter;CardView cardView;
@Overrideprotected 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;}@Overridepublic 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.RecyclerViewandroid: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.FloatingActionButtonandroid: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" /><SearchViewandroid: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add_contacts);init();button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><EditTextandroid: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" /><EditTextandroid: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" /><EditTextandroid: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" /><EditTextandroid: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" /><EditTextandroid: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" /><EditTextandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><Buttonandroid: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" /><ImageViewandroid: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>