Communiquer entre un fragment et une activité – meilleures pratiques

Cette question consiste principalement à solliciter des opinions sur la meilleure façon de gérer mon application. J'ai trois fragments traités par une activité. Le fragment A a un élément cliquable. La photo et le Fragment B ont 4 éléments cliquables sur les boutons. L'autre fragment affiche les détails lorsque la photo est cliquée. J'utilise ActionBarSherlock.

Capture d'écran

  • Communication avec le serveur client Android
  • Communication Android entre deux applications
  • Applications Android, communication avec un périphérique branché sur le port USB
  • Options de communication Peer-to-Peer
  • Communiquez avec Activity from Service (LocalService) - Best Practices d'Android
  • Android - getTargetFragment et setTargetFragment - À quoi servent-ils
  • Les boutons avant et arrière doivent changer la photo pour les poses suivantes ou précédentes, respectivement. Je pourrais garder la photo et les boutons dans le même fragment, mais je voulais les séparer au cas où je voulais les réorganiser dans une tablette.

    J'ai besoin de conseils – puis-je combiner Fragments A et B? Dans le cas contraire, je vais devoir comprendre comment mettre en œuvre une interface pour 3 éléments cliquables.

    J'ai envisagé d'utiliser Roboguice, mais je suis déjà en train d'utiliser SherlockFragmentActivity, donc c'est un non go. J'ai vu une mention d'Otto, mais je n'ai pas vu de bons tutoriels sur la façon d'inclure dans un projet. Que pensez-vous que la meilleure pratique de conception devrait être?

    J'ai également besoin d'aide pour savoir comment communiquer entre un fragment et une activité. J'aimerais garder certaines données «globales» dans l'application, comme la pose id. Existe-t-il un exemple de code que je peux voir en plus de l'information du développeur de stock android? Ce n'est pas si utile.

    BTW, je stocke déjà toutes les informations sur chaque pose dans une base de données SQLite. C'est la partie facile.

    8 Solutions collect form web for “Communiquer entre un fragment et une activité – meilleures pratiques”

    La façon la plus simple de communiquer entre votre activité et les fragments utilise les interfaces. L'idée est essentiellement de définir une interface à l'intérieur d'un fragment donné A et de laisser l'activité implémenter cette interface.

    Une fois qu'elle a implémenté cette interface, vous pouvez faire tout ce que vous voulez dans la méthode qu'elle remplace.

    L'autre partie importante de l'interface est que vous devez appeler la méthode abstraite de votre fragment et n'oubliez pas de la lancer dans votre activité. Il devrait prendre une ClassCastException si elle n'est pas effectuée correctement.

    Il existe un bon tutoriel sur Simple Developer Blog sur la façon de faire exactement ce genre de chose.

    J'espère que cela vous a été utile!

    La méthode proposée pour communiquer entre les fragments consiste à utiliser les callbacks \ listeners qui sont gérés par votre activité principale.

    Je pense que le code sur cette page est assez clair: http://developer.android.com/training/basics/fragments/communicating.html

    Vous pouvez également faire référence à l'application IO 2012 Schedule, qui est conçue pour être une application de référence de facto. On le trouve ici: http://code.google.com/p/iosched/

    De plus, voici une question de SO avec de bonnes informations: comment passer des données entre des fragments

    Il est implémenté par l'interface call back: avant tout, nous devons créer une interface:

    public interface UpdateFrag { public void updatefrag(); } 

    Dans l'activité, faites le code suivant:

     UpdateFrag updatfrag ; public void updateApi(UpdateFrag listener) { updatfrag = listener; } 

    De l'événement d'où le rappel doit déclencher l'activité:

     updatfrag.updatefrag(); 

    Dans Fragment, implémentez l'interface dans CreateView, faites le code suivant:

      ((Home)getActivity()).updateApi(new UpdateFrag() { @Override public void updatefrag() { .....your stuff...... } }); 

    Il existe plusieurs façons de communiquer entre les activités, les fragments, les services, etc. L'évident est de communiquer à l'aide d'interfaces. Cependant, ce n'est pas un moyen productif de communiquer. Vous devez implémenter les auditeurs, etc.

    Ma suggestion est d'utiliser un bus d'événement. Le bus d'événements est une implémentation de modèle de publication / abonnement.

    Vous pouvez vous abonner aux événements de votre activité, puis vous pouvez publier ces événements dans vos fragments, etc.

    Ici, sur mon blog, vous trouverez plus de détails sur ce modèle et un exemple de projet pour montrer l'utilisation.

    Je ne suis pas sûr de bien comprendre ce que vous voulez faire, mais le moyen suggéré de communiquer entre les fragments consiste à utiliser les rappels avec l'activité, jamais directement entre les fragments. Voir ici http://developer.android.com/training/basics/fragments/communicating.html

    Vous pouvez créer une interface publique avec une déclaration de fonction dans le fragment et implémenter l'interface dans l'activité. Ensuite, vous pouvez appeler la fonction à partir du fragment.

    J'utilise Intents pour communiquer les actions à l'activité principale. L'activité principale est de les écouter en remplaçant onNewIntent (Intention intention). L'activité principale traduit ces actions par les fragments correspondants.

    Vous pouvez donc faire quelque chose comme ceci:

     public class MainActivity extends Activity { public static final String INTENT_ACTION_SHOW_FOO = "show_foo"; public static final String INTENT_ACTION_SHOW_BAR = "show_bar"; @Override protected void onNewIntent(Intent intent) { routeIntent(intent); } private void routeIntent(Intent intent) { String action = intent.getAction(); if (action != null) { switch (action) { case INTENT_ACTION_SHOW_FOO: // for example show the corresponding fragment loadFragment(FooFragment); break; case INTENT_ACTION_SHOW_BAR: loadFragment(BarFragment); break; } } } 

    Ensuite, dans n'importe quel fragment pour montrer le fragment foo:

     Intent intent = new Intent(context, MainActivity.class); intent.setAction(INTENT_ACTION_SHOW_FOO); // Prevent activity to be re-instantiated if it is already running. // Instead, the onNewEvent() is triggered intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); getContext().startActivity(intent); 

    J'ai fait une bibliothèque d'annotation qui peut faire le casting pour vous. regarde ça. https://github.com/zeroarst/callbackfragment/

     @CallbackFragment public class MyFragment extends Fragment { @Callback interface FragmentCallback { void onClickButton(MyFragment fragment); } private FragmentCallback mCallback; @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt1 mCallback.onClickButton(this); break; case R.id.bt2 // Because we give mandatory = false so this might be null if not implemented by the host. if (mCallbackNotForce != null) mCallbackNotForce.onClickButton(this); break; } } } 

    Il génère ensuite une sous-classe de votre fragment. Et ajoutez-le simplement à FragmentManager.

     public class MainActivity extends AppCompatActivity implements MyFragment.FragmentCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction() .add(R.id.lo_fragm_container, MyFragmentCallbackable.create(), "MY_FRAGM") .commit(); } Toast mToast; @Override public void onClickButton(MyFragment fragment) { if (mToast != null) mToast.cancel(); mToast = Toast.makeText(this, "Callback from " + fragment.getTag(), Toast.LENGTH_SHORT); mToast.show(); } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.