繁体   English   中英

Android - 恢复以编程方式创建的视图

[英]Android - Restore Programmatically Created Views

我目前正在设计一款可帮助您管理食谱的应用程序。 创建食谱时,当您单击“添加”按钮时,将以编程方式创建一系列 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 非常相似

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM