Enregistrer / mettre à jour les données EditText de Fragment dans un FragmentStatePagerAdapter

introduction

J'ai une activité avec un livre qui contient un arrayliste de type "page" et pour gérer toutes les pages que j'ai décidé d'utiliser un FragmentStatePagerAdapter dans lequel un de mes fragments contient une page.

  • Impression à long terme d'Android
  • Android Studio refuse d'accepter que Google Repository soit installé
  • Erreur: MapFragment ne peut pas être diffusé sur android.support.v4.app.Fragment
  • L'activité Android onDestroy () n'est pas toujours appelée et si elle est appelée, seule une partie du code est exécutée
  • Erreur de listactivité avec un dispositif de gestion de gelée (SPAN_EXCLUSIVE_EXCLUSIVE ne peut pas avoir une longueur de zéro)
  • Passer un objet d'une activité à un fragment
  • J'ai créé une interface pour la communication entre chaque fragment dans le pager et l'activité du père. La méthode que j'ai besoin dans cette interface est la mise à jour d'une page montrée dans un fragment, donc j'ai mis en œuvre l'activité du père, l'interface pour recevoir les données d'un fragment et les stocker dans une page à sauvegarder dans l'arrayliste.

    Chaque fragment a un EditText dans lequel l'utilisateur peut écrire et je configure un addTextChangedListener pour saisir le moment où l'utilisateur arrête d'écrire. Lorsque l'utilisateur cesse d'écrire dans EditText, onTextChanged (), j'appelle la fonction implémentée dans l'activité père.

    C'est mon code d'activité

    public class BookEditorActivity implements BookEditorFragment.EditorFrToEditorActInterface { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.book_editor_activity); Bundle extras = getIntent().getExtras(); b = (Book) extras.get("book"); setBookViewPager(b); } private void setBookViewPager(Book b) { mBookViewPager = (ViewPager) findViewById(R.id.book_editor_pager); mBookViewPagerAdapter = new BookViewPagerAdapter(getSupportFragmentManager(), b); mBookViewPager.setAdapter(mBookViewPagerAdapter); } @Override public void saveBookPageTextContent(String textContent) { int current = mBookViewPager.getCurrentItem(); if (b.getPages().get(current) instanceof BookPageText) { ((BookPageText) b.getPages().get(current)).setContentPageText(textContent); } } @Override public void newBookPageText() { int current = mBookViewPager.getCurrentItem(); BookPageText bookPageText = new BookPageText(); bookPageText.setContentPageText(""); b.getPages().add(b.getPages().size() - 1, bookPageText); setIndicator(current + 1, b.getPages().size()); mBookViewPagerAdapter.notifyDataSetChanged(); } } 

    C'est le code du fragment

     public class BookEditorFragment extends Fragment { private EditorFrToEditorActInterface mCallback; public interface EditorFrToEditorActInterface { void newBookPageText(); void saveBookPageTextContent(String s); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle pageContent = getArguments(); if (pageContent != null) { page = pageContent.getParcelable("page"); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (page instanceof BookPageText) { BookPageText bookPage = (BookPageText) page; mView = inflater.inflate(R.layout.book_page_text_fragment, container, false); contentPage = (EditText) mView.findViewById(R.id.content_text); String contentPageText = bookPage.getContentPageText(); contentPage.setText(contentPageText.isEmpty() ? "" : Html.fromHtml(contentPageText)); contentPage.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence c, int start, int before, int count) { mCallback.saveBookPageTextContent(c.toString()); } public void beforeTextChanged(CharSequence c, int start, int count, int after) { } public void afterTextChanged(Editable c) { } }); } return mView; } @Override public void onAttach(Context context) { super.onAttach(context); try { mCallback = (EditorFrToEditorActInterface) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " must implement NewPageInterface"); } } @Override public void onDetach() { mCallback = null; super.onDetach(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.editor_new_text: mCallback.newBookPageText(); break; } } } 

    C'est le code FragmentStatePagerAdapter

     public class BookViewPagerAdapter extends FragmentStatePagerAdapter { private ArrayList<Object> bookPages = new ArrayList<>(); private final SparseArray<WeakReference<BookEditorFragment>> instantiatedFragments = new SparseArray<>(); public BookViewPagerAdapter(FragmentManager fm, Book b) { super(fm); this.bookPages = b.getPages(); } @Override public Fragment getItem(int position) { Object page = bookPages.get(position); Bundle pageContent = new Bundle(); if (page instanceof BookPageText) { BookPageText bookPageText = (BookPageText) page; pageContent.putParcelable("page", bookPageText); } BookEditorFragment fragment = new BookEditorFragment(); fragment.setArguments(pageContent); return fragment; } @Override public int getCount() { return bookPages.size(); } @Override public Object instantiateItem(final ViewGroup container, final int position) { final BookEditorFragment fragment = (BookEditorFragment) super.instantiateItem(container, position); instantiatedFragments.put(position, new WeakReference<>(fragment)); return fragment; } @Override public void destroyItem(final ViewGroup container, final int position, final Object object) { instantiatedFragments.remove(position); super.destroyItem(container, position, object); } @Nullable public Fragment getFragment(final int position) { final WeakReference<BookEditorFragment> wr = instantiatedFragments.get(position); if (wr != null) { return wr.get(); } else { return null; } } @Override public int getItemPosition(Object object) { int position = bookPages.indexOf(object); return position == -1 ? POSITION_NONE : position; } } 

    En raison de la longueur du code, j'ai supprimé certaines parties comme onClickListener, onPageSelectionListener et d'autres types de pages que je crée en ce moment.

    Le problème

    Cette logique semble fonctionner correctement, mais chaque fois que je modifie le contenu d'un EditText dans un fragment, le fragment de fermeture à gauche est également mis à jour et je ne sais pas pourquoi.

    Entrez la description de l'image ici
    Comme vous pouvez le voir dans l'image, si j'écris quelque chose dans EditText2, le même contenu apparaîtra dans EditText1 et cela n'a aucun sens.

    Un autre problème est quand j'ajoute une nouvelle page dans le livre, la page est créée correctement, mais avec le contenu de la page précédente, cela n'a aucun sens. (encore!)

    Mes tentatives

    1) J'ai essayé de capturer onFocusChange au lieu d'utiliser addTextChangedListener, mais rien n'a changé.

    2) J'ai essayé de mettre en œuvre une logique différente à l'aide de onChangePageListener() , mais dans ce cas, je mBookViewPager.getCurrentItem() le mBookViewPager.getCurrentItem() afin que la mise à jour ne soit pas mBookViewPager.getCurrentItem() .

    3) J'ai essayé tous ces messages: un , deux , trois et quatre .

    Comment puis-je corriger ce comportement étrange? Est-il possible que le problème réside dans la façon dont je fais référence aux pages dans la liste d'Array du livre?

    Merci

  • Puis-je exécuter Android Studio (émetteur SDK Android) dans une machine virtuelle hyper-v de Microsoft?
  • Uncaught exception lancé par le finalisateur: Google API bug Ou un kernel de Samsung?
  • Comment utiliser ProGuard dans Android Studio?
  • Android, Checkbox listenener en XML?
  • Maintenez la position de défilement avec chaque rafraîchissement dans la vue de liste
  • Utilisation de Android MediaRecorder
  • One Solution collect form web for “Enregistrer / mettre à jour les données EditText de Fragment dans un FragmentStatePagerAdapter”

    Certaines des erreurs possibles que j'ai trouvées dans votre mise en œuvre sont.

    1. Gérer l'implémentation actuelle de pose de la page

        mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int p) { current = p; Log.e("Postion", "" + p); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) {} @Override public void onPageScrollStateChanged(int arg0) {} }); 
    2. Le viewpager charge automatiquement la vue privee et la suivante pour l'empêcher de définir le pager OffscreenPageLimit en appelant mathod

       mViewPager.setOffscreenPageLimit(); 
    3. Assurez-vous toujours que si vous utilisez la déclaration if dans l'adaptateur, vous devriez placer la contrepartie toujours par l'intermédiaire else déclaration, même pour toute valeur par défaut.

       if (page instanceof BookPageText) { BookPageText bookPageText = (BookPageText) page; pageContent.putParcelable("page", bookPageText); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.