基于java的Android手机通讯录【详细】【完整代码】

您所在的位置:网站首页 政务软件CIO通讯录 基于java的Android手机通讯录【详细】【完整代码】

基于java的Android手机通讯录【详细】【完整代码】

2024-07-09 10:25| 来源: 网络整理| 查看: 265

提示:代码在基本模块中,教程纯文字,推荐两个屏幕一边看代码一边看教程 简易Android通讯录系统,只要半天就能写完! (博主安卓一些功能用的不熟练)

文章目录 前言一、基本模块代码(包含UI界面代码)Activity类:(1)主页面MainActivity(2)增加联系人ContactsAdd(3)联系人信息ContactsInfo(4)修改联系人ContactsUpdate 工具类:(1)联系人对象Contacts(2)自定义适配器MyAdapter(3)数据库管理MySQLite 二、实现逻辑1、逻辑执行图2、功能实现ContactsAdd:(1)增加联系人SharedPreferences实现存草稿 RecyclerView:点击'三个点'跳转至ContactsInfo:(2)删除联系人AlertDiglog实现删除询问 (3)修改联系人 点击'电话图标'跳转至拨号界面 MainActivity:(4)查询数据 MySQLIte:MyAdapter:Contacts:click.xml 和 selector_click.xml 总结

前言

需要掌握学习的知识点: 1、基本的UI界面编写。 2、Intent的基本使用。 3、Menu的基本使用。 4、RecyclerView的基本使用。 5、SharedPreferences的基本使用。 6、SQLite数据库的基本使用(简单的SQL增删改查)。

提示:加粗的加粗的知识点是必须掌握的,未加粗的知识点可以用其他方式替代。

一、基本模块代码(包含UI界面代码)

提示:以下是纯代码,代码中有部分逻辑注释

Activity类: (1)主页面MainActivity package com.example.maillist; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import java.util.Comparator; import java.util.List; /** * 显示联系人主页面 * 可以跳转到添加联系人 * 可以跳转到拨打电话 * 可以跳转到联系人详细信息 */ public class MainActivity extends AppCompatActivity { List list;//数据库中读取的联系人数据 MySQLite mMySQLite = MySQLite.getMySQLite(this);//操作数据库的对象 //活动一开始旧执行的代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialization(); } //活动创建需要初始化的数据 private void initialization() { initContacts(); initRecyclerView(); } //活动重新开始,重新执行初始化数据,将数据库中修改的数据直接同步一遍 @Override protected void onRestart() { super.onRestart(); initialization(); } //软件运行时,修改数据库后刷新控件 private void initRecyclerView() { //获取RecycleView对象 RecyclerView recycle = (RecyclerView) findViewById(R.id.recycle_view); //创建自定义适配器 MyAdapter adapter = new MyAdapter(list, this); //用于指定布局方式 RecyclerView.LayoutManager manager = new LinearLayoutManager(this); recycle.setLayoutManager(manager); recycle.setAdapter(adapter); } //打开软件获取数据库数据,初始化联系人列表 private void initContacts() { //从数据库中查询联系人信息 list = mMySQLite.query(); //排序显示 list.sort(new Comparator() { @Override public int compare(Contacts o1, Contacts o2) { return o1.getName().compareTo(o2.getName()); } }); } //动态加载菜单布局 @Override public boolean onCreateOptionsMenu(Menu menu) { //动态加载菜单布局 getMenuInflater().inflate(R.menu.main, menu); return true; } //菜单点击事件 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.add_menu://添加联系人 - 跳转到添加联系人界面 Intent intent = new Intent(MainActivity.this, ContactsAdd.class); startActivity(intent); break; case R.id.back_menu://退出程序 finish(); break; default: break; } return true; } } (2)增加联系人ContactsAdd package com.example.maillist; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; /** * 添加联系人的Activity界面,管理界面控件并处理添加联系人的逻辑 */ public class ContactsAdd extends AppCompatActivity implements View.OnClickListener{ //添加联系人活动的一些控件 EditText name; EditText phoneNumber; Button confirm; Button temp; Button back; MySQLite mMySQLite = MySQLite.getMySQLite(this); //0 - back 1 - save 2 - yes int flag = 0; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_layout); initView(); setClickButton(); //取出临时存储的数据 getTemp(); } //执行活动销毁的业务逻辑 @Override protected void onDestroy() { super.onDestroy(); //根据状态执行对应逻辑 switch(flag){ case 0://back clearEditText(); break; case 1://save break; case 2://yes clearEditText(); break; } saveTemp(); } //初始化控件对象 private void initView() { name = (EditText) findViewById(R.id.name_add_edit); phoneNumber = (EditText) findViewById(R.id.phone_number_add_edit); confirm = (Button) findViewById(R.id.add_back_button); temp = (Button) findViewById(R.id.add_temp_button); back = (Button) findViewById(R.id.add_yes_button); } //为按键设置监听器 private void setClickButton() { confirm.setOnClickListener(this); temp.setOnClickListener(this); back.setOnClickListener(this); } //设置按键点击事件 @Override public void onClick(View v) { switch(v.getId()){ case R.id.add_back_button: flag = 0; finish(); break; case R.id.add_temp_button://临时存储这个页面的数据 flag = 1; finish(); break; case R.id.add_yes_button://将这个页面的数据存放到联系人数据库中 flag = 2; createContacts(); break; } } private void createContacts() { //根据用户输入创建一个联系人对象 Contacts contacts = new Contacts(name.getText().toString(), phoneNumber.getText().toString(), 0, 0); if(contacts.getPhoneNumber() != null && !contacts.getPhoneNumber().equals("")) {//判断是否输入号码 //将联系人对象添加到数据库 mMySQLite.add(contacts); Toast.makeText(this, "添加成功!", Toast.LENGTH_SHORT).show(); finish(); } else{ Toast.makeText(this, "数据有误!", Toast.LENGTH_SHORT).show(); } } private void clearEditText() { //这个是为了保存后不在将输入框的数据存放到文件,避免添加成功后,下次恢复已经添加的数据到添加输入框中 name.setText(""); phoneNumber.setText(""); } //临时存储数据到文件中 public void saveTemp(){ //使用SharedPreferences存储临时数据 SharedPreferences temp = getSharedPreferences("temp", MODE_PRIVATE); SharedPreferences.Editor editor = temp.edit(); editor.putString("name",name.getText().toString()); editor.putString("phoneNumber", phoneNumber.getText().toString()); editor.apply(); } //恢复文件中临时存储的数据 private void getTemp() { SharedPreferences temp = getSharedPreferences("temp", MODE_PRIVATE); String name = temp.getString("name", ""); String phoneNumber = temp.getString("phoneNumber", ""); this.name.setText(name); this.phoneNumber.setText(phoneNumber); } } (3)联系人信息ContactsInfo package com.example.maillist; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; /** * 显示联系人详细信息 * 可以跳转到编辑联系人活动 * 可以删除联系人 */ public class ContactsInfo extends AppCompatActivity implements View.OnClickListener { TextView mName; TextView mPhoneNumber; Button back; Button update; TextView delete; //临时存储当前对象的数据信息 int id; String name; String phoneNumber; MySQLite mMySQLite = MySQLite.getMySQLite(this); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contacts_info); //获取上一个活动传递的数据 Intent intent = getIntent(); id = intent.getIntExtra("id", -1); //初始化并设置点击事件 initView();//初始化控件 initText(id);//初始化显示文本 setClickButtons();//设置按键点击监听器 } @Override protected void onRestart() { super.onRestart(); initText(id); } //根据id获取数据库中的数据,并且完成当前联系人信息的初始化 private void initText(int id) { MySQLite db = MySQLite.getMySQLite(this); Contacts contacts = db.query(id); name = contacts.getName(); phoneNumber = contacts.getPhoneNumber(); if (name != null && phoneNumber != null) { mName.setText(name); mPhoneNumber.setText(phoneNumber); } else {//如果此id在数据库中没有获取到数据,给出提示 Toast.makeText(this, "Info:系统出错,请稍后再试!", Toast.LENGTH_SHORT).show(); } } private void setClickButtons() { back.setOnClickListener(this); update.setOnClickListener(this); delete.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.back_info_button: finish(); break; case R.id.update_info_button: Intent intent = new Intent(ContactsInfo.this, ContactsUpdate.class); intent.putExtra("id", id); startActivity(intent); break; case R.id.delete_info_text: dialog();//删除提示 break; } } //删除提示消息框 private void dialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("提示:");//提示框 dialog.setMessage("删除联系人将无法恢复,是否继续?");//提示框消息内容 dialog.setCancelable(false);//是否可以使用back(返回退出对话框) dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {//设置确定点击事件 @Override public void onClick(DialogInterface dialog, int which) { mMySQLite.delete(id);//数据库中删除 finish(); } }); dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(ContactsInfo.this, "取消删除!", Toast.LENGTH_SHORT).show(); } }); dialog.show();//将提示消息框显示 } private void initView() { mName = (TextView) findViewById(R.id.name_info_text); mPhoneNumber = (TextView) findViewById(R.id.phone_number_info_text); back = (Button) findViewById(R.id.back_info_button); update = (Button) findViewById(R.id.update_info_button); delete = (TextView) findViewById(R.id.delete_info_text); } } (4)修改联系人ContactsUpdate package com.example.maillist; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; /** * 联系人信息编辑界面 */ public class ContactsUpdate extends AppCompatActivity implements View.OnClickListener { private int id; EditText name; EditText phoneNumber; Button save; Button back; MySQLite mMySQLite = MySQLite.getMySQLite(this); Contacts mContacts; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contacts_update_layout); initView(); initEdit(); setClickButton(); } private void setClickButton() { save.setOnClickListener(this); back.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.save_update_button: saveUpdate();//保存修改的数据到数据库中 break; case R.id.back_update_button: Toast.makeText(this, "修改取消!", Toast.LENGTH_SHORT).show(); break; } finish(); } private void saveUpdate() { mContacts.setId(id); mContacts.setName(name.getText().toString()); mContacts.setPhoneNumber(phoneNumber.getText().toString()); mMySQLite.update(mContacts);//修改数据库 Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show(); } //根据id从数据库中查询数据,对输入框将旧数据显示 private void initEdit() { mContacts = mMySQLite.query(id); if (mContacts != null) { this.name.setText(mContacts.getName()); this.phoneNumber.setText(mContacts.getPhoneNumber()); } } private void initView() { id = getIntent().getIntExtra("id", -1); name = (EditText) findViewById(R.id.name_update_edit); phoneNumber = (EditText) findViewById(R.id.phone_number_update_edit); save = (Button) findViewById(R.id.save_update_button); back = (Button) findViewById(R.id.back_update_button); } } 工具类: (1)联系人对象Contacts package com.example.maillist; /** * 联系人对象 * 一些联系人对象信息的相关操作 */ public class Contacts { private int id; private String name;//姓名 private String phoneNumber;//电话号码 public Contacts(String name, String phoneNumber, int call_icon, int more_icon) { this.name = name; setPhoneNumber(phoneNumber); } public String getName() { return name; } public String getPhoneNumber() { return phoneNumber; } public void setName(String name) { this.name = name; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public int getId() { return id; } public void setId(int id) { this.id = id; } } (2)自定义适配器MyAdapter package com.example.maillist; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; /** * RecyclerView自定义适配器 * 动态加载了子项的资源 * 编写了子项的点击逻辑 */ public class MyAdapter extends RecyclerView.Adapter { List list; Activity main;//传入主活动对象,用于调用startActivity跳转页面 static class ViewHolder extends RecyclerView.ViewHolder { View contacts;//记录父类控件id int id; TextView contactsName; TextView contactsPhoneNumber; TextView contactsCall; TextView contactsMore; public ViewHolder(@NonNull View itemView) { super(itemView); //初始化控件 contacts = itemView;//记录这个父类控件id contactsName = itemView.findViewById(R.id.contacts_name); contactsPhoneNumber = itemView.findViewById(R.id.contacts_phone_number); contactsCall = itemView.findViewById(R.id.call_icon); contactsMore = itemView.findViewById(R.id.more_icon); } } //创建一个可以传入数据的构造器 public MyAdapter(List list, Activity activity) { this.list = list; main = activity;//构造器初始化传入的主活动对象 } //onCreateViewHolder方法用于ViewHolder滑动到屏幕是动态加载加载布局,并且将加载的布局返回后存储 @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_item, parent, false); ViewHolder holder = new ViewHolder(view); //设置点击监听 holder.contactsCall.setOnClickListener(new View.OnClickListener() {//拨打电话 @Override public void onClick(View v) {//设置拨打电话Intent跳转 String phoneNumber = holder.contactsPhoneNumber.getText().toString(); Intent intent = new Intent(Intent.ACTION_DIAL);//意图:拨号行动 intent.setData(Uri.parse("tel:" + phoneNumber));//设置对应的号码 main.startActivity(intent); } }); holder.contactsMore.setOnClickListener(new View.OnClickListener() {//跳转至详情页面 @Override public void onClick(View v) { Intent intent = new Intent(main, ContactsInfo.class); intent.putExtra("id", holder.id); intent.putExtra("name", holder.contactsName.getText().toString()); intent.putExtra("phoneNumber", holder.contactsPhoneNumber.getText().toString()); main.startActivity(intent); } }); holder.contacts.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); return holder; } //为滑动到屏幕的holder布局设置资源文件 //传入一个holder和对应的号数,为其设置资源文件 @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Contacts contacts = list.get(position); holder.id = contacts.getId();//设置每个子项的id holder.contactsName.setText(contacts.getName()); holder.contactsPhoneNumber.setText(contacts.getPhoneNumber()); holder.contactsCall.setText("📞"); holder.contactsMore.setText("···"); } @Override public int getItemCount() { return list.size(); } } (3)数据库管理MySQLite package com.example.maillist; import android.annotation.SuppressLint; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.List; /** * 完成数据库的操作,继承SQLiteOpenHelper帮助类 */ public class MySQLite extends SQLiteOpenHelper { private static final String TAG = "MySQLite"; private static MySQLite mMySQLite; SQLiteDatabase db; public static final String CREATE_CONTACTS_LIST = "create table ContactsList(" + "id integer primary key autoincrement," + "name text," + "phoneNumber text)"; private MySQLite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } //确保只有一个数据库操作对象 - 单例 public static MySQLite getMySQLite(Context context) { if (mMySQLite == null) { mMySQLite = new MySQLite(context, "Contacts", null, 1); } return mMySQLite; } //数据库表的创建 @Override public void onCreate(SQLiteDatabase db) { //创建一个联系人表 db.execSQL(CREATE_CONTACTS_LIST); } //数据库版本升级 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table ContactsList"); onCreate(db); } //添加一条数据到数据库 public void add(Contacts contacts) { db = getWritableDatabase(); db.execSQL("insert into ContactsList(name,phoneNumber) values(?,?)", new String[]{contacts.getName(), contacts.getPhoneNumber()}); db.close(); // ContactsList.addContacts(contacts); query(); } //根据id删除一条数据 public void delete(int id) { db = getWritableDatabase(); String s = "" + id; db.execSQL("delete from ContactsList where id = ?", new String[]{s}); db.close(); } //查询全部数据 public List query() { db = getWritableDatabase(); Cursor cursor = db.rawQuery("select * from ContactsList", null); ArrayList list = new ArrayList(); //将联系人信息找到并添加到联系人列表中 Contacts contacts; if (cursor.moveToFirst()) { do { @SuppressLint("Range") int id = cursor.getInt(cursor.getColumnIndex("id")); @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name")); @SuppressLint("Range") String phoneNumber = cursor.getString(cursor.getColumnIndex("phoneNumber")); contacts = new Contacts(name, phoneNumber, 0, 0); contacts.setId(id);//设置id list.add(contacts); } while (cursor.moveToNext()); } db.close(); return list; } //根据id查询一条数据 public Contacts query(int id) { db = getWritableDatabase(); Cursor cursor = db.rawQuery("select * from ContactsList where id = ?", new String[]{"" + id}); Contacts contacts = null; if (cursor.moveToFirst()) { @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name")); @SuppressLint("Range") String phoneNumber = cursor.getString(cursor.getColumnIndex("phoneNumber")); contacts = new Contacts(name, phoneNumber, 0, 0); } db.close(); return contacts; } //修改数据库的数据,传入一个需要修改的数据对象 public void update(Contacts contacts) { db = getWritableDatabase(); db.execSQL("update ContactsList set name = ?,phoneNumber = ? where id = ?", new String[]{contacts.getName(), contacts.getPhoneNumber(), contacts.getId() + ""}); db.close(); } } 二、实现逻辑 1、逻辑执行图

在这里插入图片描述

这是整个通讯录的简单界面跳转逻辑(第一次画这个东西,代码写完了再画图,ԾㅂԾ,,凑合看看),每个Activity都通过MySQLit类,根据上一个Activity传递的值对数据库和当前界面控件进行操作。

2、功能实现 ContactsAdd: (1)增加联系人 SharedPreferences实现存草稿

初始化一些控件,为按钮添加点击事件。 调用getTemp恢复之前存储的草稿。

1、联系人添加: 当用户再输入框界面完成对姓名和电话的输入,按下保存按钮时,将当前flag状态记录为2,获取输入框中的信息,封装为Contacts对象,通过MySQLite类的add()方法传封装好的对象,将数据添加到数据库中。

2、存为草稿: 当用户按下存为草稿时,将当前flag状态记录为1,然后执行finish()结束当前Activity。

3、返回: 当用户按下返回时,将当前flag状态记录为0,然后执行finish()结束当前Activity。

4.onDestory(): Activity被销毁时,会调用此方法,在此方法中,根据先前记录的flag状态,判断是否将输入框中的数据存储到文件中。

RecyclerView: 点击’三个点’跳转至ContactsInfo:

此Activity被调用,会传入对应的联系人对象在数据库中的id。 初始化一些控件,为按钮添加点击事件。 根据传入的id从数据库中查询的数据,设置需要显示的姓名和电话。

(2)删除联系人 AlertDiglog实现删除询问

在ContactsInfo界面中,有删除联系人的按键。

当此按键按下,会弹出一个AlertDialog的提示框,询问是否确认删除该联系人,然后给提示框的yes和no按钮设置点击事件。

(1)在yes点击事件中调用MySQLitem类的delete()方法删除指定id的数据库中的数据。删除后调用finish()销毁当前ContactsInfo活动。

(2)在no点击事件中,不做任何操作,结束提示框。

(3)修改联系人

在ContactsInfo界面中,有编辑联系人的按键。

当此按键按下,会跳转到ContactsUpdate活动界面,并且传入一个对应需要修改的联系人在数据库中的id。

ContactsUpdate:

初始化一些控件,为按钮添加点击事件。 根据传入的id通过MySQLitem在数据库中查询对应的信息,将信息加载到输入框中等待修改。当用户修改完:

按下保存时: 读取用户在输入框中输入的内容,封装成一个Contacts对象,然后通过MySQLitem的update()方法将数据库中对应id的数据修改成传入的Contacts对象的数据。

按下取消时: 调用finish()销毁当前Activity。

点击’电话图标’跳转至拨号界面

当该图标被点击,跳转到拨号界面,并且将对应联系人对象的电话自动输入到拨号输入框。

MainActivity:

每次MainActivity界面重新显示到手机屏幕时,会调 用onRestart(),我们重写此方法,在其中添加初始化ContactsList数据,并且重新加载RecyclerView控件。

(4)查询数据

初始化联系人列表数据,调用MySQLite类中的select()的无参方法,将所有查询到的联系人信息封装成ArrayList对象返回。

MySQLIte:

此类继承SQLiteOpenHelper数据库帮助类,通过获取的读写对象调用execSQL()方法编写SQL语句完成数据库的管理。

并且该类采用单例设计模式中的懒汉式,整个程序只会创建一个对象,其余Activity需要使用该类的功能时,只需要调用getMySQLite()方法即可获得该类对象,该类无法通过构造器创建。

MyAdapter:

基础的自定义适配器,为子项添加了点击事件。

Contacts:

存储联系人信息的类,用于创建联系人对象。

click.xml 和 selector_click.xml

将控件的背景设置为此资源,当控件被点击时会更改背景,让用户获得点击反馈。

click.xml

selector_click.xml

总结

整个通讯录管理系统也不会很困难,我是第一次写,也是刚学完SQL的增删改查后想动手实践一下。这个程序是为了复习先前学习的知识,并且实践SQL,并没有什么优化。相对而言是一个简单的学习程序,望支持!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3