IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Utilisation des fragments


Sujet :

Android

  1. #1
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut Utilisation des fragments
    Bonjour,

    j'ai suivis le tuto de Viish pour l'utilisation des fragments : http://sberfini.developpez.com/tutor...oid/fragments/

    j'arrive bien a ajouter mes 2 fragments a mon activité principales :



    mais je n'arrive pas a ajouter des elements (bouton, texte, ...) dans ces fragments.

    j'ai essayer en intégrant directement le code d'un bouton dans le code XML de mon fragment de droite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="utf-8"?>
    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.developpez.tutoriel.fragment.MenuFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/menu_fragment">
     
        <Button
            android:id="@+id/boutonLire"
            android:layout_width="match_parent"
            android:layout_height="77dp"
           />
    </fragment>
    mais j'obtient une erreur :
    Exception raised during rendering: com.android.layoutlib.bridge.MockView cannot be cast to android.view.ViewGroup
    je ne peux rien ajouter via le menu graphique, eclipse ne me laisse pas faire.

    ps : je ne touche pas au XML d'habitude, je ne passe que par l'editeur graphique.

    une idée ?

    Merci

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non mais un fragment ne contient pas de views...
    C'est un "repository" pour dire que à cet endroit, on va avoir un *autre* fichier XML (le 'content' du fragment).

    Il est possible dans l'editeur d'interface de choisir quel XML d'ailleurs (c'est marqué en gros: Pick preview layout from the "Fragment Layout" context menu).

    Bouton droit... Fragment Layout... Choose layout... choisir le XML du fragment...


    Il faut voir le "fragment" comme une partie d'interface réutilisable.... par exemple un List/Details...
    Il ne faut surtout pas considérer le fragment comme un "Layout".
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Non mais un fragment ne contient pas de views...
    C'est un "repository" pour dire que à cet endroit, on va avoir un *autre* fichier XML (le 'content' du fragment).

    Il est possible dans l'editeur d'interface de choisir quel XML d'ailleurs (c'est marqué en gros: Pick preview layout from the "Fragment Layout" context menu).

    Bouton droit... Fragment Layout... Choose layout... choisir le XML du fragment...


    Il faut voir le "fragment" comme une partie d'interface réutilisable.... par exemple un List/Details...
    Il ne faut surtout pas considérer le fragment comme un "Layout".

    Donc il faut que je crée un nouveau fichier XML, que j'ajoute par exemple mes boutons et que je le mette en layout au fragment.
    C'est ca ?

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non mais il faut faire l'inverse...

    Le "Fragment" est un utilitaire permettant de factoriser le code. On pouvait faire la même chose avant avec d'un coté (XML) des "include", et de l'autre (Code) un héritage et des classes utilitaires.

    Maintenant c'est tout géré par le framework autant en profiter....


    Donc... les étapes sont inchangées:
    1. Faire les "fragments", avec leurs layout à eux, comme si c'était des activités à part entière.
    2. Faire les activités (sans oublier de les déclarer dans le manifest) et, leur layout qui inclut (éventuellement) les fragments nécessaires. Lors de cette phase, il est possible de dire à l'éditeur d'utiliser les layout des fragment pour la preview (mais ce n'est pas nécessaire).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    je n'y arrive vraiment pas :

    j'ai mes 4 classes : 2 héritant d'activity et 2 autres de fragments.

    ma premiere activité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class MainActivity extends Activity
    {
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		/*
    		 * super.onCreate(savedInstanceState);
    		 * setContentView(R.layout.activity_main);
    		 */
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.menu_fragment);
    	}
     
    	public boolean onCreateOptionsMenu(Menu menu)
    	{
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.activity_main, menu);
    		return true;
    	}
    }
    la classe héritant de fragment qui en découle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MenuFragment extends Fragment 
    {
     
    	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    	{
    		View mainView = inflater.inflate(R.layout.activity_main, container, false);		
    		return mainView;
    	}
     
     
    }
    j'ai le même code pour ma seconde activités/ fragment (detail) ,seul change les noms.

    mes fichiers XML :

    menu_fragment.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="utf-8"?>
    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.example.lxpmobile.MenuFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/menu_fragment">
    </fragment>
    detail_fragment.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="utf-8"?>
    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.example.lxpmobile.DetailFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/detail_fragment">
    </fragment>
    et la vue complète avec les 2 fragments:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
     
        <fragment
            android:id="@+id/menu_fragment"
            android:name="com.example.lxpmobile.MenuFragment"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="30">
        </fragment>
     
        <fragment
            android:id="@+id/detail_fragment"
            android:name="com.example.lxpmobile.DetailFragment"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="70" >
     
        </fragment>
     
    </LinearLayout>
    et lorsque je lance mon appli, elle se ferme directement et j'obtient ces logs :

    12-05 13:47:27.217: E/AndroidRuntime(1220): FATAL EXCEPTION: main
    12-05 13:47:27.217: E/AndroidRuntime(1220): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lxpmobile/com.example.lxpmobile.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.ActivityThread.access$600(ActivityThread.java:130)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.os.Handler.dispatchMessage(Handler.java:99)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.os.Looper.loop(Looper.java:137)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.ActivityThread.main(ActivityThread.java:4745)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at java.lang.reflect.Method.invokeNative(Native Method)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at java.lang.reflect.Method.invoke(Method.java:511)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at dalvik.system.NativeStart.main(Native Method)
    12-05 13:47:27.217: E/AndroidRuntime(1220): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at com.example.lxpmobile.MenuFragment.onCreateView(MenuFragment.java:21)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:807)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1013)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1112)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.Activity.onCreateView(Activity.java:4664)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.Activity.setContentView(Activity.java:1867)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at com.example.lxpmobile.MainActivity.onCreate(MainActivity.java:25)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.Activity.performCreate(Activity.java:5008)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
    12-05 13:47:27.217: E/AndroidRuntime(1220): ... 11 more
    12-05 13:47:27.217: E/AndroidRuntime(1220): Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f070000, tag null, or parent id 0xffffffff with another fragment for com.example.lxpmobile.MenuFragment
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.app.Activity.onCreateView(Activity.java:4669)
    12-05 13:47:27.217: E/AndroidRuntime(1220): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
    12-05 13:47:27.217: E/AndroidRuntime(1220): ... 29 more

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f070000, tag null, or parent id 0xffffffff with another fragment for com.example.lxpmobile.MenuFragment
    Donc il y a un problème d'inclusion de fragment à l’intérieur d'un fragment ... Comme on n'a pas activity_main.xml (le fragment en question), difficile de dire exactement ce que c'est.... A moins que ce ne soit le fichier global ?

    Normalement on a un truc comme ca au niveau arborescence:

    Activité1: layout 'activite1.xml' => layout qui peut contenir des fragments par exemple Fragment1 et Fragment2
    Activité2 : layout 'activite2.xml' => layout qui peut contenir des fragments par exemple Fragment1
    Fragment1: layout 'fragment1.xml' (pas de fragment dedans, c'est interdit, et supporté bizarrement en 4.2)
    Fragment2: layout 'fragment2.xml' (pas de fragment dedans, c'est interdit, et supporté bizarrement en 4.2)


    La je vois:
    MainActivity (R.layout.menu_fragment) [attention, je te conseille de ne pas utiliser fragment dans le nom du layout, car ce n'est pas un layout de fragment, il PEUT contenir des fragment] ... contient un seul fragment "MenuFragment"

    MenuFragment (R.layout.activity_main) [attention, il n'y a rien pour dire que c'est un layout de fragment, et donc qu'il ne peut contenir de fragments] ... Si c'est le fichier "complet" alors oui ca crash, d'autant qu'il ferait appel à lui-même (boucle sans fin).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    Citation Envoyé par nicroman Voir le message

    MenuFragment (R.layout.activity_main) [attention, il n'y a rien pour dire que c'est un layout de fragment, et donc qu'il ne peut contenir de fragments] ... Si c'est le fichier "complet" alors oui ca crash, d'autant qu'il ferait appel à lui-même (boucle sans fin).
    oui activity_main est le fichier complet : qui rassemble mes 2 fragments :

    activity_main.xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
     
        <fragment
            android:id="@+id/menu_fragment"
            android:name="com.example.lxpmobile.MenuFragment"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="30">
        </fragment>
     
        <fragment
            android:id="@+id/detail_fragment"
            android:name="com.example.lxpmobile.DetailFragment"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="70" >
     
        </fragment>
     
    </LinearLayout>
    attention, il n'y a rien pour dire que c'est un layout de fragment
    ok, je vais le renommer.

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Donc si c'est un layout de fragment, il ne peut pas y avoir de fragment dedans !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    Comment ca ? c'est pourtant bien ce qui est fais dans le tuto : http://sberfini.developpez.com/tutor...oid/fragments/

    non ?

  10. #10
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    Bon j'ai (enfin) réussis a créer mes fragments, j'ai don un fragments contenant une liste et un autre contenant le detail.

    ma liste contient 2 éléments : Accueil et client.
    Je voudrais que le contenue du fragment de droite (celui du détail) change en fonction du bouton sur lequel je clic. Je ne vois pas trop comment faire pour "switcher" entre les différents "styles" que pourrais prendre ce fragement:

    edit : problème resolus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 05/01/2016, 10h29
  2. Création d'une action bar avec l'utilisation des fragments
    Par sadok_fst1989 dans le forum Android
    Réponses: 3
    Dernier message: 15/06/2014, 01h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo