从导航菜单返回片段后,为什么我的<EditText>字段为空?

米哈尔

我的应用程序有问题,我有一个导航栏,可以在片段之间进行切换,在第一个片段中,我可以查看在第三个片段中添加的项目。我使用MVVM,一切正常,我在第三个片段中添加了工作人员,并在第一个片段中出现了,这里没问题,但是当我添加一些内容然后切换片段以查看更改然后再次添加内容时,我的应用程序将EditText字符串视为空(即使它们不在应用程序视图中)。

我在导航之间切换的代码:

fun openFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.container, fragment)
        transaction.addToBackStack(fragment.tag)
        transaction.commit()
    }

    /**Navigation menu */
    val menuNavigationClickListener =
        BottomNavigationView.OnNavigationItemSelectedListener { item ->
            when (item.itemId) {
                R.id.navigation_products -> {
                    toolbar.title = "Products"
                    openFragment(productsFragment)
                    return@OnNavigationItemSelectedListener true
                }
                R.id.navigation_dishes -> {
                    toolbar.title = "Dishes"
                    openFragment(dishesFragment)
                    return@OnNavigationItemSelectedListener true
                }
                R.id.navigation_add -> {
                    toolbar.title = "Add"
                    openFragment(addFragment)
                    return@OnNavigationItemSelectedListener true
                }
            }
            false
        }

有什么建议?

编辑:张贴第3个片段

class Add : Fragment(), AdapterView.OnItemSelectedListener {
val NEW_SPINNER_ID = 1
val ANOTHER_SPINNER_ID = 2
var productPosition: Int? = null
var dishPosition: Int? = null

fun showToast(context: FragmentActivity? = activity, message: String, duration: Int = Toast.LENGTH_LONG) {
    Toast.makeText(context, message, duration) .show()
}
/**Spinner implementation TODO */

override fun onNothingSelected(parent: AdapterView<*>?) {
    showToast(activity,"nothing selected ",3)
}

override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
    when (parent?.id) {
        1 -> {productPosition = position
            showToast(message ="product list")
        }
        else -> {dishPosition = position
            showToast(message = "dish list")
        }
    }
}


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view: View = inflater.inflate(R.layout.fragment_add, container, false)




    /** initialize ui with viewmodel*/

    fun initializeUi() {

        // Get the AddViewModelFactory with all of it's dependencies constructed
        val factory = InjectorUtils.provideAddViewModelFactory()
        // Use ViewModelProviders class to create / get already created AddViewModel
        // for this view (activity)
        val viewModel = ViewModelProviders.of(requireActivity(), factory)
            .get(AddViewModel::class.java)

        /** BINDERS FOR BUTTONS AND FIELDS */
        val name     = view.findViewById<EditText>(R.id.product_name).text
        val price    = view.findViewById<EditText>(R.id.product_price).text
        val tax      = view.findViewById<EditText>(R.id.product_tax).text
        val waste    = view.findViewById<EditText>(R.id.product_waste).text
        val weightOfAddedProduct = view.findViewById<EditText>(R.id.product_weight)
        val addButton = view.findViewById<Button>(R.id.addProduct)
        val createDishButton = view.findViewById<Button>(R.id.new_dish_button)
        val addProductToDishBtn = view.findViewById<ImageButton>(R.id.add_product_to_dish)



        /** ADAPTERs FOR SPINNERs */
        var productAdapter = ArrayAdapter(requireActivity(),android.R.layout.simple_spinner_item,viewModel.getProducts().value!!.map { it.name })
        productAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        val mySpinner = view.findViewById<Spinner>(R.id.mySpinner)
        with(mySpinner)
        {
            adapter = productAdapter
            setSelection(0, false)
            onItemSelectedListener = this@Add
            prompt = "Select product"
            gravity = Gravity.CENTER
        }
        mySpinner.id = NEW_SPINNER_ID


        var dishesAdapter = ArrayAdapter(requireActivity(),android.R.layout.simple_spinner_item,viewModel.getDishes().value!!.map{it.name})
        dishesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        val dishSpinner = view.findViewById<Spinner>(R.id.dishSpinner)
        with(dishSpinner){
            adapter = dishesAdapter
            setSelection(0,false)
            onItemSelectedListener = this@Add
            prompt = "Select dish"
            gravity = Gravity.CENTER
        }
        dishSpinner.id =  ANOTHER_SPINNER_ID


        /**OBSERVING LIVEDATA FROM ADDVIEWMODEL
         *  WHICH OBSERVES LIVEDATA IN REPOSITORY
         *  WHICH OBSERVES LIVEDATA FROM DAO */

        viewModel.getProducts().observe(this, Observer { products ->
            productAdapter.clear()
            products.forEach { product ->
                productAdapter.add(product.name)
            }
        })

        viewModel.getDishes().observe(this, Observer { dishes ->
            dishesAdapter.clear()
            dishes.forEach{dish ->
                dishesAdapter.add(dish.name)
            }

        })

        /** BUTTONS FUNCTIONALITY */

        createDishButton.setOnClickListener{
            CreateDish().show(childFragmentManager,CreateDish.TAG)
        }
        addButton.setOnClickListener{
            if(name.isNullOrEmpty()||
                price.isNullOrEmpty()||
                tax.isNullOrEmpty()||
                waste.isNullOrEmpty()){showToast(message = "Fill all data!")}
            else {
                val product = Product(
                    name.toString(),
                    price.toString().toDouble(),
                    tax.toString().toDouble(),
                    waste.toString().toDouble()
                )
                viewModel.addProducts(product)

                name.clear()
                price.clear()
                tax.clear()
                waste.clear()
            }
        }
        addProductToDishBtn.setOnClickListener{
            val pickedDish     = viewModel.getDishes().value!![this!!.dishPosition!!]
            val pickedProduct  = viewModel.getProducts().value!![this!!.productPosition!!]
            viewModel.addProductToDish(pickedDish,pickedProduct,weightOfAddedProduct.text.toString().toDouble())
        }

    }

    initializeUi()
    return view
}
companion object {
    fun newInstance():Add = Add()
    const val TAG = "Add"
}
格雷格

我想我明白问题所在。因此,成功添加产品后,您将返回片段编号1(产品列表)。那里有新产品,太好了。现在,您将返回到第3个片段(添加产品),期望表单仍被填充(编辑文本字段等),但是它们为空白。

原因是第二次返回到第三个片段时,onCreateView将再次调用该片段,并重新创建整个片段。在此initializeUi方法的任何地方都不会填充文本字段(它不会记住您上一次在该片段上的时间的值)。

您需要根据视图模型中的数据填充方法中EditText字段initializeUi

val name = view.findViewById<EditText>(R.id.product_name).text
name.text = viewModel.someLiveDataField.value

更新:

尝试.text从这些行的末尾删除(并重命名):

val nameEditText     = view.findViewById<EditText>(R.id.product_name)
val priceEditText    = view.findViewById<EditText>(R.id.product_price)
val taxEditText      = view.findViewById<EditText>(R.id.product_tax)
val wasteEditText    = view.findViewById<EditText>(R.id.product_waste)

现在,在您的中OnClickListener,将其更改为:

val product = Product(
                    nameEditText.text,
                    priceEditText.text.toDouble(),
                    taxEditText.text.toDouble(),
                    wasteEditText.text.toDouble()
                )

(如果语法略有错误,则表示歉意)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何检查我的editText字段是否为空,并使其通过Button转到新的活动?

来自分类Dev

旋转后片段字段为空

来自分类Dev

电话号码查询后EditText为空-Android

来自分类Dev

在导航到另一个片段并使用Kotlin中的“后退”按钮返回后,为什么片段中的EditText显示相同的值?

来自分类Dev

EditText为空/双精度

来自分类Dev

检查editText是否为空

来自分类Dev

为什么即使立即实例化我的字段也为空?

来自分类Dev

为什么用角使我的输入字段为空?

来自分类Dev

实例化后仍为空的静态字段

来自分类Dev

检查(numberDecimal)edittext是否为空/空

来自分类Dev

由于两个空的 edittext 字段,我的 android 应用程序崩溃

来自分类Dev

在Android中将Width和Height设置为wrap_content后,为什么我的EditText在水平或垂直方向上展开?

来自分类Dev

更改焦点后,EditText字段未清除

来自分类Dev

EditText获取android空字段的值

来自分类Dev

空EditText错误(很多EditText)

来自分类Dev

按下按钮且EditText为空时,我的应用程序不断崩溃

来自分类Dev

为什么此自动装配字段始终为空?

来自分类Dev

Android Studio EditText字段为null或0

来自分类Dev

如果EditText为空,如何禁用Button?

来自分类Dev

Android:防止Alert中的EditText为空

来自分类Dev

检查是否为空EditText失败

来自分类Dev

Android Studio,如果editText为空

来自分类Dev

edittext.getText().getString() 始终为空

来自分类Dev

使用按钮检查 EditText 是否为空

来自分类Dev

如果表中的任何 EditText 为空

来自分类Dev

为什么我的朋友选择器片段为空?

来自分类Dev

从列表发送电子邮件后,为什么字段TO为空?

来自分类Dev

如果给定的EditText为空,如何防止焦点移至下一个字段?

来自分类Dev

如果给定的EditText为空,如何防止焦点移至下一个字段?

Related 相关文章

  1. 1

    如何检查我的editText字段是否为空,并使其通过Button转到新的活动?

  2. 2

    旋转后片段字段为空

  3. 3

    电话号码查询后EditText为空-Android

  4. 4

    在导航到另一个片段并使用Kotlin中的“后退”按钮返回后,为什么片段中的EditText显示相同的值?

  5. 5

    EditText为空/双精度

  6. 6

    检查editText是否为空

  7. 7

    为什么即使立即实例化我的字段也为空?

  8. 8

    为什么用角使我的输入字段为空?

  9. 9

    实例化后仍为空的静态字段

  10. 10

    检查(numberDecimal)edittext是否为空/空

  11. 11

    由于两个空的 edittext 字段,我的 android 应用程序崩溃

  12. 12

    在Android中将Width和Height设置为wrap_content后,为什么我的EditText在水平或垂直方向上展开?

  13. 13

    更改焦点后,EditText字段未清除

  14. 14

    EditText获取android空字段的值

  15. 15

    空EditText错误(很多EditText)

  16. 16

    按下按钮且EditText为空时,我的应用程序不断崩溃

  17. 17

    为什么此自动装配字段始终为空?

  18. 18

    Android Studio EditText字段为null或0

  19. 19

    如果EditText为空,如何禁用Button?

  20. 20

    Android:防止Alert中的EditText为空

  21. 21

    检查是否为空EditText失败

  22. 22

    Android Studio,如果editText为空

  23. 23

    edittext.getText().getString() 始终为空

  24. 24

    使用按钮检查 EditText 是否为空

  25. 25

    如果表中的任何 EditText 为空

  26. 26

    为什么我的朋友选择器片段为空?

  27. 27

    从列表发送电子邮件后,为什么字段TO为空?

  28. 28

    如果给定的EditText为空,如何防止焦点移至下一个字段?

  29. 29

    如果给定的EditText为空,如何防止焦点移至下一个字段?

热门标签

归档