【问题标题】:Why menu option is not tapping when I created all the method?为什么当我创建所有方法时菜单选项没有点击?
【发布时间】:2021-05-16 09:42:17
【问题描述】:

我正在尝试创建一个删除菜单图标,当我点击它时,它会打开一个对话框,询问是否从列表中删除此项目,但是当我点击它时什么都没有发生。

删除菜单所在的文件

UpdateFragment.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>

注意:评论您还需要哪些文件,我将编辑问题。

【问题讨论】:

  • 尝试在deleteUser()之前或之后添加日志
  • @Marat 当我点击它时没有 deleteUser() 的日志,它只是没有做任何事情
  • 您确定图标来自您的片段而不是来自您的活动吗?
  • @Marat 是的,我是..
  • 可以包含delete_menu.xml吗?

标签: android android-studio kotlin android-room


【解决方案1】:

您的菜单项的 ID 为 menu_delete,但是在您的片段中,您正在检查 itemId 是否为 R.menu.delete_menu

您正在检查一个不存在的 ID

【讨论】:

    【解决方案2】:

    您在调用deleteUser() 函数时尝试使用delete_menu 比较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】:

      试试这个:

      override fun onOptionsItemSelected(item: MenuItem): Boolean {
          return when (item.itemId) {
              R.id.delete_menu -> {
                  deleteUser()
                  true
              }
              else -> super.onOptionsItemSelected(item)
          }
      }
      

      【讨论】:

        【解决方案4】:

        问题是R.menu.delete_menuonOptionsItemSelected 方法中。

        会变成R.id.delete_menu

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-11
          • 2021-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          相关资源
          最近更新 更多