我正在尝试创建一个删除菜单图标,当我点击它时,它会打开一个对话框,询问是否从列表中删除该项目,但当我点击时没有任何反应。
删除菜单所在的文件
更新片段.kt
包 com.example.roomtutorial1.fragments.update
import android.app.AlertDialog
import android.os.Bundle
import android.text.TextUtils
import android.view.*
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.example.roomtutorial1.R
import com.example.roomtutorial1.data.UserViewModel
import com.example.roomtutorial1.model.User
import kotlinx.android.synthetic.main.fragment_update.*
import kotlinx.android.synthetic.main.fragment_update.view.*
class UpdateFragment : Fragment() {
private val args by navArgs<UpdateFragmentArgs>()
private lateinit var mUserViewModel: UserViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_update, container, false)
mUserViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
view.updateFirstName.setText(args.currentUser.firstName)
view.updateLastName.setText(args.currentUser.lastName)
view.updateAge.setText(args.currentUser.age.toString())
view.updateBtn.setOnClickListener {
updateItem()
}
//Set menu
setHasOptionsMenu(true)
return view
}
private fun updateItem() {
val firstName = updateFirstName.text.toString()
val lastName = updateLastName.text.toString()
val age = updateAge.text.toString()
if (!(TextUtils.isEmpty(firstName) && TextUtils.isEmpty(lastName) && age.isEmpty())) {
//Create User Object
val updateUser = User(args.currentUser.id, firstName, lastName, age.toInt())
//Update current user
mUserViewModel.updateUser(updateUser)
//Navigate back
findNavController().navigate(R.id.action_updateFragment_to_listFragment)
Toast.makeText(requireContext(), "Updated Successfully", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(requireContext(), "Please fill all the fields", Toast.LENGTH_SHORT)
.show()
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.delete_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == R.menu.delete_menu) {
deleteUser()
}
return super.onOptionsItemSelected(item)
}
private fun deleteUser() { //delete function
val builder = AlertDialog.Builder(requireContext())
builder.setPositiveButton("Yes") { _, _ ->
mUserViewModel.deleteUser(args.currentUser)
Toast.makeText(
requireContext(),
"Successfully Deleted ${args.currentUser.firstName}",
Toast.LENGTH_SHORT
).show()
}
builder.setNegativeButton("No") { _, _ -> }
builder.setTitle("Delete ${args.currentUser.firstName}?")
builder.setMessage("Are you sure you want to delete ${args.currentUser.firstName}")
builder.create().show()
}
}
delete_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_delete"
android:title="Delete"
android:icon="@drawable/ic_delete_24"
android:iconTint="@color/white"
app:showAsAction="ifRoom"
/>
</menu>
注意:评论你需要更多的文件,我会编辑问题。
答案 0 :(得分:2)
您的菜单项 ID menu_delete
但是在您的片段中,您正在检查 itemId 是否为 R.menu.delete_menu
您正在检查一个不存在的 ID
答案 1 :(得分:1)
试试这个:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.delete_menu -> {
deleteUser()
true
}
else -> super.onOptionsItemSelected(item)
}
}
答案 2 :(得分:1)
您在调用 delete_menu
函数时尝试使用 deleteUser()
来比较 itemId,而这是 XML 的名称而不是 itemId。
试试这个:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_delete -> {
deleteUser()
return true
}
else -> return super.onOptionsItemSelected(item)
}
}
这应该可以解决它。
答案 3 :(得分:1)
问题是 R.menu.delete_menu
方法中的 onOptionsItemSelected
。
它会变成R.id.delete_menu