EditText Settext无法使用Fragment

Tus*_*kar 25 android android-edittext

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

EditText entityName = (EditText) view.findViewById(R.id.entityName);    
entityName.setText(entity.getEntityname());
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

注意:我使用的是Android 2.2版

Tus*_*kar 84

EditText似乎在重置文本时遇到问题onCreateView.所以这里的解决方案是重置文本onResume.这有效.

在onActivityCreated中也存在问题.我在onStart中重置edittext的内容并且它可以工作.[积分给@savepopulation]

  • 我刚刚遇到这个问题,并注意到如果调用onStart它也会工作.值得注意的是,使用TextView的东西按预期工作,但是一旦开始使用EditText或AutoCompleteTextView,就会开始遇到这些问题. (3认同)
  • 难以置信的!!这花了我几个小时.有没有人报告这是谷歌的一个错误或这是设计?我怀疑后者. (3认同)
  • 它工作非常感谢你。你能解释一下为什么会发生这种类型的问题吗 (2认同)
  • 很好的答案!!! ..总是使用`onStart()`来设置片段中的默认值.. (2认同)

Dav*_*vid 10

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

例如,类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);
        ....
    }
    ....
   }
Run Code Online (Sandbox Code Playgroud)

有控制是否保存状态的参数:"freezesText"和"hasSelection".无法选择TextView,因此hasSelection为false.函数getFreezesText(),在TextView类中也返回false.因此,TextView不会保存状态.EditText.java的代码:

    @Override
    public boolean getFreezesText() {
    return true;
    }
Run Code Online (Sandbox Code Playgroud)

EditText返回true,因此EditText应该保存状态.

有一些方法来解决这个bug:

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

2.实现EditText的onSaveInstanceState,返回null.如下:

 public Parcelable onSaveInstanceState() {
      super.onSaveInstanceState();
     return null;
 }
Run Code Online (Sandbox Code Playgroud)

3.使用EditText.setSaveEnable(false);

4.add param in xml"saveEnable ='false'"