EditText不会更新

时间:2018-01-28 09:09:37

标签: android android-fragments android-edittext

那里有2个片段。其中一个包含EditTextfragmentA)。

如果我通过从另一个片段调用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"] 隐藏了吗?

1 个答案:

答案 0 :(得分:0)

我可以从popBackStack中了解到将片段放入容器时可能使用replace。当进行replace事务时,旧片段会保存其状态,并且所有UI组件(EditTextTextViewButton)也会保存其状态。一旦状态被保存,UI组件就会被破坏,以至于在从视图中删除旧片段之后尝试引用它们将不起作用(如果你试图设置或更改它们中的某些内容,通常会导致NPE,但我不确定是什么发生在你的情况下)。在使用popBackStack返回旧片段时,UI会在片段onCreateView内重新膨胀,因此您将拥有新创建的UI组件。如果有可用的已保存状态,它将用于将UI恢复到它被其他片段替换之前的状态。由于EditText中的文本以保存状态保存,因此当您返回旧片段时它会被恢复,因此从新片段设置它无济于事。此技术用于有效使用内存,从而防止应用程序导致OutOfMemory例外。

为了纠正这个问题,旧片段应该包含一个回调,当重新创建UI时,新片段可以调用该回调来更新EditText值。回调将从旧片段传递到新片段,然后新片段将调用此回调并将新字符串传递给它。应首先使用旧片段内的全局变量存储此新字符串。当旧片段在其onCreateView中重新创建UI时,检查全局字符串变量是否为空且不为空,因此使用EditText更新setText()