Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EditText Settext not working with Fragment

I have fragments for 3 states of a screen; Add, Edit and View. In Add, I create an entity and save it. Next time I open it in View mode and set the entity name using

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

I click on the edit button from View mode to open the Edit mode. I change the entity name here and save it. This brings me back to the view screen. But I find the entity name is not updated. I debug and found that entity.getEntityname() is having correct value. I am not sure why the edit text does not take new value.

Any ideas?

Note: I am using android version 2.2

like image 225
Tushar Vengurlekar Avatar asked Nov 09 '12 06:11

Tushar Vengurlekar


2 Answers

The EditText appears to have an issue with resetting text in onCreateView. So the solution here is to reset the text in onResume. This works.

Also there's an issue in onActivityCreated. I reset edittext's content in onStart and it works. [credits to @savepopulation]

like image 132
Tushar Vengurlekar Avatar answered Sep 18 '22 15:09

Tushar Vengurlekar


There are some classes of View in Android should save their status when their container is detached. Fragment.onViewCreated() should be called before View.onSaveInstanceState(). So if you set a value in the method Fragment.onViewCreated(). The value should be cleared in the method View.onRestoreInstanceState(Parcelable state).

For example,class TextView,RecyclerView and so on.You can read the code of 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);         ....     }     ....    } 

There are to params to control whether to save the state: "freezesText" and "hasSelection". TextView can't be selected,so hasSelection is false. the function ,getFreezesText(),return false in class TextView too. So,TextView would not save the state. the code of EditText.java:

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

EditText return true,so EditText should save the state.

There some method to fix this bug:

1.implement EditText.getFreezesText() and return false,and clear the state of select in EditText

2.implement onSaveInstanceState of EditText, return null.like this:

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

3.use EditText.setSaveEnable(false);

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

like image 22
David Avatar answered Sep 21 '22 15:09

David