EditText Settext无法使用Fragment

问题描述 投票:22回答:5

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

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

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

有任何想法吗?

注意:我使用的是Android 2.2版

android android-edittext
5个回答
81
投票

EditText似乎在重置onCreateView中的文本时出现问题。所以这里的解决方案是重置onResume中的文本。这有效。

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


9
投票

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);
        ....
    }
    ....
   }

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

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

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

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

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

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

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

3.使用EditText.setSaveEnable(false);

4.add param in xml“saveEnable ='false'”


4
投票

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

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

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

但是,如果你从一个bundle中设置这个数据,那么实例变量中的值会更好,因为bundle可能会变为null而你可以得到null指针问题然后


3
投票

onActivityCreated也有一个问题。我在onStart中重置了edittext的内容并且它有效。


2
投票

根据@TusharVengrulekar,您必须实现Fragment

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();
}
}<!---->
© www.soinside.com 2019 - 2024. All rights reserved.