Kotlin - DialogFragment中Edittext中的字符串不保存在数据类中

Posted

技术标签:

【中文标题】Kotlin - DialogFragment中Edittext中的字符串不保存在数据类中【英文标题】:Kotlin - String from Edittext in DialogFragment don't save in data class 【发布时间】:2021-11-19 19:31:00 【问题描述】:

我在 DialogFragment 中有一个 Edittext 并创建了一个新组。当我按“确定”时,组已创建但没有字符串。

我试着弄清楚,但我不知道哪里错了。

我的 DialogFragment:

class NewCategory(val listener: NewCategoryCreateListener) : DialogFragment() 

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog 
        val view = requireActivity()
        val newCategoryView = view.layoutInflater.inflate(R.layout.new_category, null)
        val txtNewCat = newCategoryView.findViewById<EditText>(R.id.etNewCategory)
        val newCat = txtNewCat.text.toString()

        return AlertDialog.Builder(requireContext())
            .setView(newCategoryView)
            .setTitle("Create new category")
            .setPositiveButton("OK") di, i ->
                listener.newCategoryCreate(newCat)
            
            .setNegativeButton("Cancel")  di, i -> 
            .create()
    

    interface NewCategoryCreateListener
        fun newCategoryCreate(text: String)
    


我的 MainFragment:

class MainFragment : Fragment(), NewCategory.NewCategoryCreateListener 

    private var _binding: FragmentMainBinding? = null
    private val binding
        get() = _binding!!

    private lateinit var shoppingListViewModel: ShoppingListViewModel
    private lateinit var categoryAdapter: CategoryAdapter

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        super.onViewCreated(view, savedInstanceState)

        binding.categoryRV.layoutManager = LinearLayoutManager(requireContext())
        shoppingListViewModel.allCategories.observe(viewLifecycleOwner, 
            updateCategories(it)
        )

        binding.addCategory.setOnClickListener 
            val newCategory = NewCategory(this)
            newCategory.show(childFragmentManager, "NewCategory")
        
    


    private fun updateCategories(list: List<Category>) 
        categoryAdapter = CategoryAdapter(list)
        binding.categoryRV.adapter = categoryAdapter
    

    override fun newCategoryCreate(text: String) 
        val newCat = Category(text)
        shoppingListViewModel.insertCategory(newCat)
    


我做错了什么?

【问题讨论】:

【参考方案1】:

您在创建对话框时将newCat 字符串设置为文本视图文本,而不是在点击确定按钮时。所以你的字符串是空的。

尝试将val newCat = txtNewCat.text.toString() 移动到您的确定按钮回调中,如下所示:


        return AlertDialog.Builder(requireContext())
            .setView(newCategoryView)
            .setTitle("Create new category")
            .setPositiveButton("OK") di, i ->
                val newCat = txtNewCat.text.toString()
                listener.newCategoryCreate(newCat)
            
            .setNegativeButton("Cancel")  di, i -> 
            .create()

【讨论】:

非常感谢 :)

以上是关于Kotlin - DialogFragment中Edittext中的字符串不保存在数据类中的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 RecyclerView 传递到 Kotlin 中的 DialogFragment?

DialogFragment 中的 Kotlin 合成和自定义布局

dialogfragment监听返回键

dialogfragment监听返回键

在 Kotlin 中调整对话框片段的大小

DialogFragment:如何防止一次又一次的动画?例如后台后