EditText Settext не работает с фрагментом

У меня есть фрагменты для 3 состояний экрана; Добавить, изменить и просмотреть. В Add я создаю сущность и сохраняю ее. В следующий раз я открою его в режиме просмотра и задаю имя объекта, используя

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

Я нажимаю кнопку редактирования в режиме просмотра, чтобы открыть режим редактирования. Я изменяю здесь имя объекта и сохраняю его. Это возвращает меня к экрану просмотра. Но я считаю, что имя объекта не обновляется. Я entity.getEntityname() и обнаружил, что entity.getEntityname() имеет правильное значение. Я не уверен, почему текст редактирования не принимает новое значение.

Есть идеи?

Примечание: я использую Android версии 2.2

Ответ 1

В редакторе EditText возникла проблема с сбросом текста в onCreateView. Итак, решение здесь - reset текст в onResume. Это работает.

Также есть проблема в onActivityCreated. я reset edittext в onStart, и он работает. [кредиты @savepopulation]

Ответ 2

Как упоминалось ранее, у EditText возникает проблема с сбросом текста в onCreateView.

Это связано с тем, что, как только фрагмент будет создан, пока мы не удалим его из backstack, его метод onResume будет вызываться, поскольку представление не создается снова.

Итак, решение здесь - reset текст в onResume. Это будет работать во все времена, даже если u заблокирует и разблокирует экран ur, пока этот фрагмент открыт или вы возвращаетесь из другого фрагмента

Однако, если вы устанавливаете эти данные из комплекта, лучше передать значение этой переменной в переменной экземпляра, потому что пакет может наступить null amd u может получить нулевые ошибки указателя, тогда

Ответ 3

Есть несколько классов View в Android, которые должны сохранять свой статус при отсоединении своего контейнера. 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(), возвращает false в классе TextView тоже. Таким образом, TextView не сохранит состояние. код EditText.java:

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

EditText возвращает true, поэтому EditText должен сохранять состояние.

Есть какой-то способ исправить эту ошибку:

1.implement EditText.getFreezesText() и вернуть false и очистить состояние select в EditText

     

2.implement onSaveInstanceState из EditText, верните значение null. Например:

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

3.use EditText.setSaveEnable(false);

     

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

Ответ 4

Также есть проблема в onActivityCreated. Я сбрасываю содержимое редактируемого текста в onStart, и оно работает.

Ответ 5

Согласно @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();
}
}<!---->