Android Fragments Android -恢复编程创建的视图

pes8fvy9  于 2022-12-19  发布在  Android
关注(0)|答案(1)|浏览(114)

我目前正在设计一个帮助你管理食谱的应用程序。当你创建食谱时,当你点击一个“添加”按钮时,一系列EditText视图会以编程方式创建。你可以根据自己的需要制作多个步骤/EditText行,所以它不是一个常数。当你点击“创建食谱”时,我会一步一步地迭代,并将EditText视图添加到一个名为“stepsList”的可变列表中。我做文本解析来挑选每一步的成分和数量,在食谱最终确定之前,你会被带到一个确认屏幕。当你返回时,我正试图用之前输入的文本恢复所有步骤。编程创建的视图不会自动恢复,你必须重新构造它们。下面是我的onCreateView()函数,它可以进行恢复:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Firebase
    auth = Firebase.auth
    db = Firebase.firestore

    utils = Utils(activity as MainActivity)

    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_recipe_setup, container, false)

    // Loop through the list of EditText views
    for (i in 0 until stepsList.size) {
        //println((stepsList[i] as EditText).text)
        if (stepsList[i] is EditText) {
            val stepListEditText = stepsList[i] as EditText

            // Add the EditText view to the fragment's layout
            val stepFieldLayout = inflater.inflate(R.layout.step, container, false)
            val stepsContainer = view.findViewById<LinearLayout>(R.id.recipe_steps_container)
            val stepEditText = stepFieldLayout.findViewById<EditText>(R.id.step_field)
            stepEditText.text = (stepsList[i] as EditText).text
            stepsContainer.addView(stepFieldLayout, i)
            println(stepEditText.text)

        }
    }
    // Inflate the layout for this fragment
    return view
}

从这里,我得到了一些奇怪的行为。正确数量的EditText视图被恢复,但无论文本是在最后一个EditText原来是所有恢复的EditText视图的文本。例如,如果我原来有3个步骤的文本'1','2','3',当他们被恢复,所有的将有'3'。更奇怪的是,println(stepEditText.text)打印了正确的文本,但是当我查看应用程序时,文本是错误的。有人有什么想法吗?我甚至会用java来回答,因为它与Kotlin非常相似

arknldoa

arknldoa1#

这是因为它们都共享相同的id。解决这个问题的简单方法是为所有编辑文本分配随机id,但这偶尔会导致错误。解决这个问题的最安全方法是覆盖onSaveInstanceState和onRestoreInstanceState,并自己进行序列化。

相关问题