android studio做一个简易通讯录,有新增,查询,查看,删除,清空,修改功能 详细代码
时间: 2024-04-30 22:21:59 浏览: 225
Android Studio 简易通讯录
好的,让我来为你详细介绍一下如何使用 Android Studio 实现一个简易通讯录应用。
首先,我们需要在 Android Studio 中创建一个新的项目,命名为“Contacts”。然后,我们需要添加一些必要的依赖项到 app/build.gradle 文件中:
```groovy
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.room:room-runtime:2.3.0'
annotationProcessor 'androidx.room:room-compiler:2.3.0'
}
```
接下来,我们需要创建一个数据模型类来表示联系人信息:
```kotlin
@Entity
data class Contact(
@PrimaryKey(autoGenerate = true)
val id: Long = 0,
val name: String,
val phone: String,
val email: String
)
```
这里我们使用了 Room 持久化库来存储联系人信息,因此我们需要在 app/build.gradle 文件中添加对 Room 的支持。
接下来,我们需要创建一个 DAO(数据访问对象)来定义访问联系人信息的方法:
```kotlin
@Dao
interface ContactDao {
@Insert
suspend fun addContact(contact: Contact)
@Query("SELECT * FROM Contact")
suspend fun getAllContacts(): List<Contact>
@Query("SELECT * FROM Contact WHERE id = :id")
suspend fun getContactById(id: Long): Contact?
@Query("DELETE FROM Contact WHERE id = :id")
suspend fun deleteContactById(id: Long)
@Query("DELETE FROM Contact")
suspend fun deleteAllContacts()
@Update
suspend fun updateContact(contact: Contact)
}
```
在这个 DAO 中,我们定义了增加、查询、删除、清空、修改联系人信息的方法。需要注意的是,所有的方法都是挂起函数(即使用了 `suspend` 修饰符),因此它们必须在协程中调用。
接下来,我们需要创建一个 Room 数据库类来管理联系人信息的存储和访问:
```kotlin
@Database(entities = [Contact::class], version = 1)
abstract class ContactDatabase : RoomDatabase() {
abstract fun contactDao(): ContactDao
}
```
在这个数据库类中,我们定义了一个抽象方法 `contactDao()` 来获取 ContactDao 对象,从而可以对联系人信息进行增删改查操作。
现在,我们已经完成了数据模型、DAO 和数据库的创建。接下来,我们需要创建一个 RecyclerView 来显示联系人列表。在 app/res/layout 目录下,创建一个名为 activity_main.xml 的布局文件,内容如下:
```xml
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/contact_item" />
```
在这个布局中,我们使用了 RecyclerView 来显示联系人列表,并使用了 LinearLayoutManager 来布局列表项。注意,我们还指定了一个名为 contact_item 的布局文件作为 RecyclerView 的列表项。
接下来,我们需要创建一个名为 contact_item.xml 的布局文件来定义 RecyclerView 的列表项:
```xml
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/nameTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Name"
android:textSize="18sp" />
<TextView
android:id="@+id/phoneTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Phone"
android:textSize="14sp" />
<TextView
android:id="@+id/emailTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Email"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
```
在这个布局中,我们使用了 CardView 来显示联系人信息,并使用了 TextView 来显示联系人的名称、电话和电子邮件地址。
现在,我们已经完成了 UI 的设计和数据库的创建。接下来,我们需要实现一些业务逻辑来完成增加、查询、删除、清空和修改联系人信息的功能。在 MainActivity.kt 文件中,我们可以编写如下代码:
```kotlin
class MainActivity : AppCompatActivity() {
private lateinit var contactDao: ContactDao
private lateinit var adapter: ContactAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val db = Room.databaseBuilder(
applicationContext,
ContactDatabase::class.java, "contacts.db"
).build()
contactDao = db.contactDao()
adapter = ContactAdapter()
recyclerView.adapter = adapter
addContactButton.setOnClickListener {
showAddContactDialog()
}
clearContactsButton.setOnClickListener {
GlobalScope.launch {
contactDao.deleteAllContacts()
updateContactList()
}
}
updateContactList()
}
private fun updateContactList() {
GlobalScope.launch {
val contacts = contactDao.getAllContacts()
withContext(Dispatchers.Main) {
adapter.submitList(contacts)
}
}
}
private fun showAddContactDialog() {
val view = LayoutInflater.from(this).inflate(R.layout.dialog_add_contact, null)
val dialog = AlertDialog.Builder(this)
.setTitle("Add Contact")
.setView(view)
.setPositiveButton("Add", null)
.setNegativeButton("Cancel", null)
.create()
dialog.setOnShowListener {
val addButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
addButton.setOnClickListener {
val nameEditText = view.findViewById<EditText>(R.id.nameEditText)
val phoneEditText = view.findViewById<EditText>(R.id.phoneEditText)
val emailEditText = view.findViewById<EditText>(R.id.emailEditText)
val name = nameEditText.text.toString().trim()
val phone = phoneEditText.text.toString().trim()
val email = emailEditText.text.toString().trim()
if (name.isEmpty() || phone.isEmpty() || email.isEmpty()) {
Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show()
} else {
GlobalScope.launch {
contactDao.addContact(Contact(name = name, phone = phone, email = email))
withContext(Dispatchers.Main) {
dialog.dismiss()
updateContactList()
}
}
}
}
}
dialog.show()
}
private fun showEditContactDialog(contact: Contact) {
val view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_contact, null)
val dialog = AlertDialog.Builder(this)
.setTitle("Edit Contact")
.setView(view)
.setPositiveButton("Save", null)
.setNegativeButton("Cancel", null)
.create()
val nameEditText = view.findViewById<EditText>(R.id.nameEditText)
val phoneEditText = view.findViewById<EditText>(R.id.phoneEditText)
val emailEditText = view.findViewById<EditText>(R.id.emailEditText)
nameEditText.setText(contact.name)
phoneEditText.setText(contact.phone)
emailEditText.setText(contact.email)
dialog.setOnShowListener {
val saveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
saveButton.setOnClickListener {
val name = nameEditText.text.toString().trim()
val phone = phoneEditText.text.toString().trim()
val email = emailEditText.text.toString().trim()
if (name.isEmpty() || phone.isEmpty() || email.isEmpty()) {
Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show()
} else {
GlobalScope.launch {
contactDao.updateContact(Contact(id = contact.id, name = name, phone = phone, email = email))
withContext(Dispatchers.Main) {
dialog.dismiss()
updateContactList()
}
}
}
}
}
dialog.show()
}
private fun showDeleteContactDialog(contact: Contact) {
val dialog = AlertDialog.Builder(this)
.setTitle("Delete Contact")
.setMessage("Are you sure you want to delete this contact?")
.setPositiveButton("Delete") { _, _ ->
GlobalScope.launch {
contactDao.deleteContactById(contact.id)
withContext(Dispatchers.Main) {
updateContactList()
}
}
}
.setNegativeButton("Cancel", null)
.create()
dialog.show()
}
inner class ContactViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val nameTextView: TextView = itemView.findViewById(R.id.nameTextView)
private val phoneTextView: TextView = itemView.findViewById(R.id.phoneTextView)
private val emailTextView: TextView = itemView.findViewById(R.id.emailTextView)
fun bind(contact: Contact) {
nameTextView.text = contact.name
phoneTextView.text = contact.phone
emailTextView.text = contact.email
itemView.setOnClickListener {
showEditContactDialog(contact)
}
itemView.setOnLongClickListener {
showDeleteContactDialog(contact)
true
}
}
}
inner class ContactAdapter : ListAdapter<Contact, ContactViewHolder>(DiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.contact_item, parent, false)
return ContactViewHolder(view)
}
override fun onBindViewHolder(holder: ContactViewHolder, position: Int) {
holder.bind(getItem(position))
}
}
class DiffCallback : DiffUtil.ItemCallback<Contact>() {
override fun areItemsTheSame(oldItem: Contact, newItem: Contact): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Contact, newItem: Contact): Boolean {
return oldItem == newItem
}
}
}
```
在这个 MainActivity.kt 文件中,我们首先定义了一个 ContactDao 对象和一个 ContactAdapter 对象,然后在 onCreate() 方法中初始化它们。我们还为“Add Contact”按钮和“Clear Contacts”按钮设置了单击事件,并在 updateContactList() 方法中更新了联系人列表。
我们使用了 Kotlin 的协程来异步执行数据库操作,并使用了 withContext(Dispatchers.Main) 来在主线程中更新 UI。
我们还定义了 showAddContactDialog()、showEditContactDialog() 和 showDeleteContactDialog() 方法来显示添加联系人、编辑联系人和删除联系人的对话框。我们还实现了 ContactViewHolder 和 ContactAdapter 类来显示联系人列表。
最后,我们定义了一个 DiffCallback 类来比较两个 Contact 对象是否相等。
至此,一个简易通讯录应用就完成了!如果你有任何疑问或需要更多帮助,请随时联系我。
阅读全文