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