EditText Settext ne fonctionne pas avec Fragment
j'ai des fragments pour 3 états d'un écran; Add, Edit et View. En Add je crée une entité et la sauve. La prochaine fois que je l'ouvre en mode vue et que je mets le nom de l'entité en utilisant
EditText entityName = (EditText) view.findViewById(R.id.entityName);
entityName.setText(entity.getEntityname());
je clique sur le bouton edit du mode View pour ouvrir le mode Edit. - Je changer le nom de l'entité d'ici et de l'enregistrer. Cela me ramène à l'écran d'affichage. Mais je trouve que le nom de l'entité n'est pas mis à jour.
Je debug et constaté que entity.getEntityname()
a la valeur correcte. Je ne suis pas sûr pourquoi le texte d'édition ne prend pas nouveau valeur.
des idées?
<!-Note: j'utilise android version 2.25 réponses
le texte édité semble avoir un problème avec la réinitialisation du texte dans onCreateView
. La solution ici est de rétablir le texte dans onResume
. Les travaux de cette.
comme mentionné précédemment, le texte édité semble avoir un problème avec la réinitialisation du texte dans onCreateView.
c'est parce qu'une fois qu'un fragment est créé , jusqu'à ce que nous le retirions de l'arrière-plan, sa méthode onResume serait appelée car la vue n'est pas créée de nouveau.
donc la solution ici est de réinitialiser le texte dans onResume. Cela fonctionnera en tout temps, même si u verrouiller et déverrouiller l'écran ur pendant que ce fragment est ouvert ou vous revenez d'un autre fragment
Toutefois, si vous définissez ces données à partir d'un bundle, il est préférable tonsave cette valeur dans une variable d'instance cause le bundle pourrait venir null amd u peut gett pointeur null questions alors
il y a aussi un problème dans onActivityCreated. J'ai réinitialisé le contenu d'edittext dans onStart et ça fonctionne.
selon le @TusharVengrulekar, c'est ainsi que vous devez implorer votre 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();
}
}
Il ya certaines classes de vue dans Android devrait enregistrer leur statut lorsque leur conteneur est détaché. Fragment.onViewCreated () doit être appelé avant View.onSaveInstanceState (). Donc si vous définissez une valeur dans le Fragment de méthode.onViewCreated (). La valeur doit être effacée dans la vue méthode.onRestoreInstanceState (État Morcelable).
par exemple,class TextView, RecyclerView et ainsi de suite.Vous pouvez lire le code de 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);
....
}
....
}
Il y a de paramètres à contrôlez s'il faut sauvegarder l'état: "freezentext"et " hasSelection". TextView ne peut pas être sélectionné,donc hasSelection est false. la fonction ,getFreezesText(),renvoie false dans la classe TextView aussi. Ainsi, TextView ne sauverait pas l'état. le code de EditText.java:
@Override
public boolean getFreezesText() {
return true;
}
EditText retourner true, alors EditText devrait sauvegarder l'état.
Il y a une méthode pour corriger ce bug:
1.implémenter EditText.getFreezesText () et return false,et effacer l'état de select dans EditText
2.implémenter onSaveInstanceState of EditText, return null.comme ceci:
public Parcelable onSaveInstanceState() {
super.onSaveInstanceState();
return null;
}
3.utilisez EditText.setSaveEnable (false);
4.ajouter param xml " saveEnable='false'"