为什么创建所有方法时菜单选项没有点击?

时间:2021-05-16 09:42:17

标签: android android-studio kotlin android-room

我正在尝试创建一个删除菜单图标,当我点击它时,它会打开一个对话框,询问是否从列表中删除该项目,但当我点击时没有任何反应。

删除菜单所在的文件

更新片段.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>

注意:评论你需要更多的文件,我会编辑问题。

4 个答案:

答案 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