Android: Les Objets De Passage Entre Les Fragments
Avant de me lancer, j'ai regarder à travers des questions comme:
Le passage des données entre des fragments: l'écran de chevauchement
Comment transmettre des valeurs entre les Fragments
ainsi que Android docs:
http://developer.android.com/training/basics/fragments/communicating.html
ainsi que cet article:
http://manishkpr.webheavens.com/android-passing-data-between-fragments/
Bien que tous les cas mentionnés ci-dessus similaire à ce que j'ai, il n'est pas totalement identique. J'ai suivi un bon tutoriel ici (une partie de mon code est basé sur cet article):
http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-views-1/
J'ai les fichiers suivants:
RegisterActivity.java
NonSwipeableViewPager.java
ScreenSliderAdapter.java
RegisterOneFragment.java
RegisterTwoFragment.java
Et les mises en page suivantes:
activity_register.xml
fragment_register_one.xml
fragment_register_two.xml
Ce que je suis en train de réaliser est le passage d'un objet Sérialisable de RegisterFragmentOne à RegisterFragmentTwo.
Jusqu'à présent c'est ce que j'ai fait (certains codes sont omis):
RegisterActivity.java
public class RegisterActivity extends FragmentActivity
implements RegisterOneFragment.OnEmailRegisteredListener{
public static NonSwipeableViewPager viewPager;
private ScreenSliderAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
//Initilization
mAdapter = new ScreenSliderAdapter(getSupportFragmentManager());
viewPager = (NonSwipeableViewPager) findViewById(R.id.pager);
viewPager.setAdapter(mAdapter);
}
public void onEmailRegistered(int position, Registration regData){
Bundle args = new Bundle();
args.putSerializable("regData", regData);
viewPager.setCurrentItem(position, true);
}
}
ScreenSliderAdapter.java
public class ScreenSliderAdapter extends FragmentPagerAdapter{
public ScreenSliderAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new RegisterOneFragment();
case 1:
return new RegisterTwoFragment();
case 2:
return new RegisterThreeFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
NonSwipeableViewPager.java (extension de ViewPager classe, et qui remplace les suivantes)
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
//Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//Never allow swiping to switch between pages
return false;
}
RegisterOneFragment.java
public class RegisterOneFragment extends Fragment {
OnEmailRegisteredListener mCallBack;
public interface OnEmailRegisteredListener {
/** Called by RegisterOneFragment when an email is registered */
public void onEmailRegistered(int position, Registration regData);
}
public void onAttach(Activity activity){
super.onAttach(activity);
//This makes sure that the container activity has implemented
//the callback interface. If not, it throws an exception.
try {
mCallBack = (OnEmailRegisteredListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnEmailRegisteredListener");
}
}
... And some to execute some HTTP request via separate thread...
}
Ce que je suis en train d'accomplir est que quand un utilisateur appuie sur un bouton sur RegisterOneFragment, les données seront envoyées à un serveur (et certains retours de validation sur JSON). Si les données renvoyées est valide, l'application devrait aller pour le fragment suivant, qui est RegistrationTwoFragment.
Je vais avoir une certaine confusion quant à la façon de passer des objets entre les fragments, depuis mon Fragments est créé à l'aide d'un Adaptateur. Et que la Carte est ensuite attaché à mon Activité.
Quelqu'un peut-il m'aider? Thx
Edit 1:
J'ai essayé de faire un raccourci (malheureusement ne fonctionne pas) comme suit:
Dans RegisterActivity j'ai créé:
public Registration regData;
et dans RegisterOneFragment:
/* PLACED ON POST EXECUTE */
((RegisterActivity)getActivity()).regData = regData;
Enfin appelé dans RegisterTwoFragment
Registration regData;
regData = ((RegisterActivity) getActivity()).regData;
Il jette à un nullPointerExceptions
Edit 2
Juste pour être clair, RegisterActivty contient de multiples fragments. Et la seule façon utilisateur peut naviguer entre le fragment est en cliquant sur un bouton. L'Activité n'a pas de barre d'Onglet.
OriginalL'auteur Jeremy | 2013-11-15
Vous devez vous connecter pour publier un commentaire.
Je devrais normalement avoir des incubateurs ou des méthodes similaires à présent dans le contenant d'activité.
Donc, si je comprends bien, vous souhaitez que l'utilisateur l'accès
RegistrationOneFragment
, une fois terminée, l'utilisation de ces données, de les valider, et s'il est valide, passer àRegistrationTwoFragment
et déplacer l'utilisateur de ceFragment
.Pourrait vous suffit d'appeler
validateJson(regData)
dans votreonEmailRegistered
méthode pour gérer la validation de votre activité, si elle réussit, la validation de la transaction deRegistrationTwoFragment
.Puis tous vous avez besoin sont des getters et setters de votre activité ou de Fragment de dire
getRegistrationOneData()
à l'activité ou àsetData(Registration args)
dans le fragment que votre montrent les exemples ci-dessus.Je ne sais pas de toute façon de passer le args directement dans le Fragment.
Si vous voulez garder le pager et l'adaptateur, alors vous devriez le garder, mais je pense que vous pouvez aussi manipuler facilement avec supportFragmentManager() et des opérations.
Je suppose que vous avez raison, c'est juste que je suis en train de le faire avec aussi peu d'efforts que possible...
OriginalL'auteur sturrockad
Il est facile de partager des objets via la mise en œuvre de Serializable de votre Objet personnalisé. J'ai écrit un tutoriel sur ce ici.
De Fragment:
Dans le Fragment de deux:
OriginalL'auteur Shihab Uddin
J'ai trouvé une solution à ma question, j'en suis sûr, pas la bonne façon de le faire...
Donc dans RegisterActivity.java j'ajoute + modifié les lignes suivantes (merci à @sturrockad):
Puis dans RegisterTwoFragments.java (ou, dans le Fragment à laquelle je souhaite recevoir l'Objet):
OriginalL'auteur Jeremy
J'ai utilisé pour définir l'objet avec Pacelable ou Serializable de transfert, mais à chaque fois que j'ajoute d'autres variables de l'objet(modèle), je l'enregistrer. C'est si gênant.
C'est super facile le transfert d'objet entre les activités ou les fragments.
Android DataCache
mettre votre objet de données à KimchiDataCache instance de votre activité ou de fragment.
Obtenir votre objet de données dans votre activité de fragment que vous avez ajouté.
Pour quelqu'un qui essaie de faire la même chose avec moins d'effort: l'utilisation de google gson à sérialiser vos pojo en json et l'envoyer avec le bundle (setArguments).
OriginalL'auteur kimkevin