EditText Settext无法使用Fragment

时间:2012-11-09 06:52:10

标签: android android-edittext

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

设置实体名称
EditText entityName = (EditText) view.findViewById(R.id.entityName);    
entityName.setText(entity.getEntityname());

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

有什么想法吗?

注意:我使用的是Android 2.2版

5 个答案:

答案 0 :(得分:80)

EditText似乎在重置onCreateView中的文字时出现问题。因此,此处的解决方案是重置onResume中的文本。这很有效。

  

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

答案 1 :(得分:5)

Android中有一些View类应该在分离容器时保存其状态。 应在View.onSaveInstanceState()之前调用Fragment.onViewCreated()。因此,如果您在方法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.Implement EditText.getFreezesText()并返回false,并清除EditText中的select状态

         

2.实现EditText的onSaveInstanceState,返回null.like this:

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

3.使用EditText.setSaveEnable(false);

         

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

  

答案 2 :(得分:4)

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

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

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

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

答案 3 :(得分:3)

onActivityCreated也存在问题。我在onStart中重置了edittext的内容,但它确实有效。

答案 4 :(得分:2)

根据@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();
}
}<!---->