2

J'ai mis en œuvre le didacticiel Android à partir du Android Training Site et tout fonctionne jusqu'à présent.Entrez EditText sur un fragment et remplissez également tous les autres fragments

À l'intérieur d'un Fragment, j'ai ajouté un champ EditText, où l'utilisateur peut entrer une chaîne de texte simple. Ce que je veux réaliser est: Si l'utilisateur a entré quelque chose, et puis balaye à gauche ou à droite, l'entrée devrait également être «copiée» le nouveau fragment.

Comme dans la formation, j'ai une classe ScreenSlidePageFragment.java et une classe ScreenSlideActivity.java.

J'ai mis en place une interface dans le ScreenSlidePageFragment, as mentioned here:

Communicator mCallback; 

public interface Communicator { 
    void sendData(String inpString); 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    try { 
     mCallback = (Communicator) context; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(context.toString() + "must Implement OnEditChangedListener"); 
    } 
} 

Mais à la fin, j'ai réussi à le recevoir sur le ScreenSlideActivity. Comment mettre à jour un fragment spécifié? Dans ScreenSlideActivity, j'ai essayé de le renvoyer au nouveau fragment.

@Override 
public void sendData(String inpString) { 
     WHATFRAGMENT.changeData(inpString); 
} 

Mais comment puis-je accéder une autre (de WHATFRAGMENT), qui sont créés dans le ScreenSlidePagerAdapter:

@Override 
public Fragment getItem(int position) { 
    return NewReservationSlidePageFragment.create(position); 
} 

Ai-je besoin de créer un tout fragment et écraser la nouvelle position? Ou est-il même nécessaire de travailler autour de l'activité? Est-il possible d'utiliser FragmentTransaction en quelque sorte?

Quelle serait la solution la plus simple pour cela?

Répondre

2

Vous pouvez réaliser avec votre interface et public void setUserVisibleHint(boolean isVisibleToUser)

Ajouter une autre méthode dans votre interface comme celui-ci,

public interface Communicator { 
    void sendData(String inpString); 
    String getData(); 
} 

Et l'activité vous créez une variable chaîne globalement pour stocker la valeur.

Et d'insérer les données à venir forme sendData dans ce

@Override 
public void sendData(String inpString) { 
    this.value = inpString; 
     //WHATFRAGMENT.changeData(inpString); 
} 

et mettre en œuvre getData aussi dans votre activité

@Override 
public void getData() { 
    return this.value; 
} 

Ajouter setUserVisibleHint dans votre fragment

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    if(isVisibleToUser) { 
     mCallback.sendData("[string from your edit text]"); 
    } else { 
     String value = mCallback.getData(); 
    } 
} 

Maintenant vous pouvez voir les données que vous avez edi ted dans un fragment peut montrer dans un autre fragment visible.

+0

La méthode 'getData()' n'est pas nécessaire. Chaque 'Fragment' appellera' sendData() 'quand il est retiré du' FragmentManager', probablement dans 'onPause()'. Probablement le 'Activity' implémente l'interface et transmet les données au' Fragment' suivant. –

+0

Si vous utilisez view pager ** onPause ** et ** OnResume ** ne recevront pas d'appel à ce moment, nous devrions utiliser la méthode ** setUserVisibleHint ** uniquement. –

+0

@MuthukrishnanRajendran Merci beaucoup, maintenant ça marche. Je ne connaissais pas 'setUserVisibleHint()' avant. Mais à un moment donné, j'ai eu un comportement, qui pourrait confondre l'utilisateur: Si le champ de texte est modifié sur l'un des autres fragments, et recopié, les données ne sont pas écrasées. Il reste le "vieux" String, même si j'essaye de l'effacer avant: 'myEditTxt.getText(). Clear()' – a2hur