J'ai une mise en page complexe à implémenter. Il dispose de 19 sections qui peuvent être affichées ou non en fonction de nombreux paramètres préalablement saisis par l'utilisateur. Afin de simplifier le code et de ne pas afficher les sections inutilisées, la mise en page est créée dynamiquement.Restaurer un fragment avec deux vues ayant le même identifiant
Tout est à l'intérieur d'un fragment. Le fragment a un LinearLayout utilisé comme conteneur et, lorsque le fragment est créé, je génère toutes les sections nécessaires.
Chaque section est gérée par son propre adaptateur local qui est chargé de gonfler la disposition de cette section et de l'ajouter dans le conteneur.
Tout fonctionne parfaitement bien. Le problème est que 2 sections ont exactement la même structure afin qu'ils partagent la même mise en page xml. Pour cette raison, les vues internes des deux sections ont le même identifiant. Ce n'est pas un problème car la section est gérée localement dans son adaptateur. Le problème apparaît lorsque je passe au fragment suivant et que je reviens à celui-ci. Le système tente de récupérer l'état précédent de la vue et, comme ces deux sections ont les mêmes ID, lorsque la seconde section est restaurée, ses valeurs sont également définies sur la première.
Y a-t-il une solution pour gérer cela ou pour dire au fragment de ne pas restaurer son état (puisque tout est rechargé manuellement de toute façon).
Voici un exemple de la lumière de la structure actuelle:
fragment xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
section xml
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/section_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
code fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_layout, container, false);
if (<condition>)
createSection1(getContext(),view);
if (<condition>)
createSection2(getContext(),view);
return view;
}
private void createSection1(Context context, ViewGroup root){
Section1Adapter adapter = new Section1Adapter(context, root);
// ...
}
private void createSection2(Context context, ViewGroup root){
Section2Adapter adapter = new Section2Adapter(context, root);
// ...
}
code adaptateur (même idée pour les deux)
public Section2Adapter(LayoutInflater inflater, ViewGroup root) {
View view = LayoutInflater.from(context).inflate(R.layout.section_layout, root, false);
initView(view);
root.addView(view);
}
Wahoo! Réponse incroyable! Merci beaucoup car je ne savais pas à ce sujet. C'est exactement ce que je cherchais. – Eselfar