那里有2个片段。其中一个包含EditText
(fragmentA
)。
如果我通过从另一个片段调用EditText
来更新EditText.setText()
,它不会显示新设置的文本,尽管它已被设置为我已设置断点并看到它。它仍然显示旧文本。
如果用户点击按钮,则在没有EditText
的片段中执行以下代码:
fragmentA.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
editTextInFragmentA.setText(text, TextView.BufferType.EDITABLE);
}
}
// Close the fragment
getActivity().getSupportFragmentManager().popBackStack();
这种方法有什么问题?可能是因为fragmentA
在调用EditText.setText
时被var str = '1word-5another & 09more#';
console.log(str.match(/(?!\d+\s?)\w+(?=\s?\W+)/g))
>> (3) ["word", "another", "more"]
隐藏了吗?
答案 0 :(得分:0)
我可以从popBackStack
中了解到将片段放入容器时可能使用replace
。当进行replace
事务时,旧片段会保存其状态,并且所有UI组件(EditText
,TextView
,Button
)也会保存其状态。一旦状态被保存,UI组件就会被破坏,以至于在从视图中删除旧片段之后尝试引用它们将不起作用(如果你试图设置或更改它们中的某些内容,通常会导致NPE,但我不确定是什么发生在你的情况下)。在使用popBackStack
返回旧片段时,UI会在片段onCreateView
内重新膨胀,因此您将拥有新创建的UI组件。如果有可用的已保存状态,它将用于将UI恢复到它被其他片段替换之前的状态。由于EditText
中的文本以保存状态保存,因此当您返回旧片段时它会被恢复,因此从新片段设置它无济于事。此技术用于有效使用内存,从而防止应用程序导致OutOfMemory
例外。
为了纠正这个问题,旧片段应该包含一个回调,当重新创建UI时,新片段可以调用该回调来更新EditText
值。回调将从旧片段传递到新片段,然后新片段将调用此回调并将新字符串传递给它。应首先使用旧片段内的全局变量存储此新字符串。当旧片段在其onCreateView
中重新创建UI时,检查全局字符串变量是否为空且不为空,因此使用EditText
更新setText()
。