30

我有 3 种屏幕状态的片段;添加、编辑和查看。在添加中,我创建一个实体并保存它。下次我在查看模式下打开它并使用设置实体名称

EditText entityName = (EditText) view.findViewById(R.id.entityName);    
entityName.setText(entity.getEntityname());

我从查看模式单击编辑按钮以打开编辑模式。我在这里更改实体名称并保存。这让我回到了视图屏幕。但我发现实体名称没有更新。我调试并发现它entity.getEntityname() 具有正确的值。我不确定为什么编辑文本没有新值。

有任何想法吗?

注意:我使用的是 android 版本 2.2

4

7 回答 7

100

EditText 似乎有重置文本的问题onCreateView。所以这里的解决方案是重置onResume. 这行得通。

onActivityCreated 也有问题。我在 onStart 中重置了 edittext 的内容,它可以工作。[归功于@savepopulation]

于 2012-11-16T10:14:14.197 回答
12

Android 中有一些 View 类应该在它们的容器分离时保存它们的状态。Fragment.onViewCreated() 应该在 View.onSaveInstanceState() 之前调用。所以如果你在方法 Fragment.onViewCreated() 中设置一个值。该值应在 View.onRestoreInstanceState(Parcelable state) 方法中清除。

比如TextView、RecyclerView等类。可以阅读TextView.java的代码:

    public Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();

    // Save state if we are forced to
    final boolean freezesText = getFreezesText();
    boolean hasSelection = false;
    int start = -1;
    int end = -1;
    ....
    if (freezesText || hasSelection) {
        SavedState ss = new SavedState(superState);
        ....
    }
    ....
   }

有参数来控制是否保存状态:“freezesText”和“hasSelection”。TextView 不能被选中,所以 hasSelection 为 false。函数 getFreezesText() 在 TextView 类中也返回 false。所以,TextView 不会保存状态。EditText.java 的代码:

    @Override
    public boolean getFreezesText() {
    return true;
    }

EditText 返回 true,所以 EditText 应该保存状态。

有一些方法可以修复此错误:

1.执行EditText.getFreezesText()并返回false,并清除EditText中select的状态

2.实现EditText的onSaveInstanceState,返回null。像这样:

 public Parcelable onSaveInstanceState() {
      super.onSaveInstanceState();
     return null;
 }

3.使用EditText.setSaveEnable(false);

4.在xml中添加参数“saveEnable='false'”

于 2017-06-06T09:35:22.710 回答
4

如前所述,EditText 似乎在 onCreateView 中重置文本存在问题。

这是因为一旦创建了一个片段,直到我们将它从后台堆栈中删除,它的方法 onResume 将被调用,因为视图不会再次创建。

所以这里的解决方案是重置onResume中的文字。即使您在该片段打开或您从另一个片段返回时锁定和解锁您的屏幕,这将始终有效

但是,如果您从包中设置此数据,则最好将该值保存在实例变量中,因为包可能为空,然后您可以解决空指针问题

于 2015-11-22T13:51:50.627 回答
4

根据@TusharVengrulekar,这就是你必须如何实现你的片段

public class ActionBar extends Fragment {

private TextView lbl_title;
private String title;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_action_bar, container, false);
    title = "Contacts";
    lbl_title = (TextView) view.findViewById(R.id.lbl_title);

    return view;
}

@Override
public void onStart(){
    super.onStart();

    lbl_title.setText(title);
}

@Override
public void onResume(){
    super.onResume();
}
}<!---->
于 2015-11-22T13:38:15.437 回答
3

中也有问题onActivityCreated。我重置了edittext的内容onStart并且它可以工作。

于 2015-01-21T12:18:16.293 回答
1

这将适用于片段 100%

  override fun onResume() {
    super.onResume()
    Handler(Looper.getMainLooper()).postDelayed({
       editText.setText("Abc")
    }, 500)

}
于 2022-02-02T06:04:10.877 回答
0

onResume()或者onStart()可以很好地重置 onEditText上的文本,popBackStack()但问题是当应用程序进入后台时,它们中的任何一个都将被触发,这不是应用程序的预期行为。我们也可以这样做,将文本重置为EditText-

override fun onViewStateRestored(savedInstanceState: Bundle?) {
   super.onViewStateRestored(savedInstanceState)
   binding.coolEt.setText("xyz")
}
于 2021-08-12T11:09:56.347 回答