我目前正在设计一个帮助你管理食谱的应用程序。当你创建食谱时,当你点击一个“添加”按钮时,一系列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非常相似
1条答案
按热度按时间arknldoa1#
这是因为它们都共享相同的id。解决这个问题的简单方法是为所有编辑文本分配随机id,但这偶尔会导致错误。解决这个问题的最安全方法是覆盖onSaveInstanceState和onRestoreInstanceState,并自己进行序列化。