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 :

Montrer le TabHost sur chaque toutes les pages


Sujet :

Android

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut Montrer le TabHost sur chaque toutes les pages
    Bonjour,

    J'ai un problème de conception. J'utilise des "Fragment" et un "TabHost".
    Mon problème est que j'ai besoin de changer de pages par exemple au click sur une ligne de listview et de pouvoir afficher autre chose tout en gardant le TabHost en bas sur toutes les pages du programme. actuellement j'utilise des Intent mais cela marche pas.

    Comment puis-je faire pour que le visible? Ne pas utiliser "TabHost"? Faire des boutons?

    Voici une photo de mon besoin:

    Nom : ExempleProjet.png
Affichages : 99
Taille : 35,8 Ko

    Merci de votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 64
    Par défaut
    Bonjour,
    je ne sais pas si c'est la "meilleure" solution mais ton fragment ouvert par l'onglet peut être qu'un simple conteneur...conteneur qui aura comme fragment principal ta listeview qui switch avec un fragment "détail" sur sélection d'un item de la liste.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Citation Envoyé par Estérésis Voir le message
    Bonjour,
    je ne sais pas si c'est la "meilleure" solution mais ton fragment ouvert par l'onglet peut être qu'un simple conteneur...conteneur qui aura comme fragment principal ta listeview qui switch avec un fragment "détail" sur sélection d'un item de la liste.
    et depuis le fragment, comment on switch ????

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 64
    Par défaut
    Attention : c'est utilisable uniquement pour android 4.2 ou version supérieure

    Ta listview est dans un fragment qui sera contenu par un autre fragment. Pour changer de fragment à partir du OnItemClickListener de la listview il faut revenir à son parent pour récupérer le fragment manager "enfant" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getParentFragment().getChildFragmentManager().beginTransaction().replace(R.id.child_container, new DetailFragment()).commit();

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Citation Envoyé par Estérésis Voir le message
    Attention : c'est utilisable uniquement pour android 4.2 ou version supérieure

    Ta listview est dans un fragment qui sera contenu par un autre fragment. Pour changer de fragment à partir du OnItemClickListener de la listview il faut revenir à son parent pour récupérer le fragment manager "enfant" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getParentFragment().getChildFragmentManager().beginTransaction().replace(R.id.child_container, new DetailFragment()).commit();
    Bonjour,

    Oui cela fonctionne mise a part que cela vient les 2 en mem temps superposées ????

    Cela efface pas le premier ?

    Aussi on perd la navigation ? si je fait retour cela ferme l'application ...

    Merci.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 64
    Par défaut
    Il me semble que le bouton "back" n'agisse pas sur les "sous-fragments" seulement sur le parent. Donc si tu n'a rien ouvert avant le fragment parent, oui cela mettra l'application en arrière.

    Pour conserver ton premier fragment (la liste), tu peux le mettre en "mémoire" (backstack) et re-écrire onBackPressed()

    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
     
    @Override
    public void onBackPressed() {
        //vérifie si le backstack n'est pas vide et émule le comportement par défaut du bouton back
        FragmentManager fm = getSupportFragmentManager();
        for (Fragment frag : fm.getFragments()) {
            if (frag.isVisible()) {
                FragmentManager childFm = frag.getChildFragmentManager();
                if (childFm.getBackStackEntryCount() > 0) {
                    childFm.popBackStack();
                    return;
                }
            }
        }
        super.onBackPressed();
    }

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Citation Envoyé par Estérésis Voir le message
    Il me semble que le bouton "back" n'agisse pas sur les "sous-fragments" seulement sur le parent. Donc si tu n'a rien ouvert avant le fragment parent, oui cela mettra l'application en arrière.

    Pour conserver ton premier fragment (la liste), tu peux le mettre en "mémoire" (backstack) et re-écrire onBackPressed()

    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
     
    @Override
    public void onBackPressed() {
        //vérifie si le backstack n'est pas vide et émule le comportement par défaut du bouton back
        FragmentManager fm = getSupportFragmentManager();
        for (Fragment frag : fm.getFragments()) {
            if (frag.isVisible()) {
                FragmentManager childFm = frag.getChildFragmentManager();
                if (childFm.getBackStackEntryCount() > 0) {
                    childFm.popBackStack();
                    return;
                }
            }
        }
        super.onBackPressed();
    }
    Je trouve cela compliqué quand même.….

    Pour le fait que cela se superpose c'est à cause que faut créer le fragment par le code ?

    C'est cela ?

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 64
    Par défaut
    Quels fragments se superposent ?

    Normalement tu as
    - un fragment, appelé en appuyant sur l'onglet, comprenant que un FrameLayout (1)
    - deux fragments qui passent de l'un à l'autre dans le FrameLayout du fragment parent (2)

    (1) et (2) oui ils se "superposent" puisque (2) s'affiche dans le conteneur de (1) c'est ce qui s'appelle Nested Fragments arrivés avec la version 4.2 d'Android

    Quand tu veux initialiser un fragment enfant (2) il faut faire appelle à getChildFragmentManager() et non getSupportFragmentManager() comme pour un fragment dans une activité.

    Tu peux aussi montrer tes bouts de code qui te gênent au besoin, ça sera plus simple pour t'aider.

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Citation Envoyé par Estérésis Voir le message
    Quels fragments se superposent ?

    Normalement tu as
    - un fragment, appelé en appuyant sur l'onglet, comprenant que un FrameLayout (1)
    - deux fragments qui passent de l'un à l'autre dans le FrameLayout du fragment parent (2)

    (1) et (2) oui ils se "superposent" puisque (2) s'affiche dans le conteneur de (1) c'est ce qui s'appelle Nested Fragments arrivés avec la version 4.2 d'Android

    Quand tu veux initialiser un fragment enfant (2) il faut faire appelle à getChildFragmentManager() et non getSupportFragmentManager() comme pour un fragment dans une activité.

    Tu peux aussi montrer tes bouts de code qui te gênent au besoin, ça sera plus simple pour t'aider.
    re,


    Dans le MainActivity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Override
        public void onNavigationDrawerItemSelected(int position) {
            // update the main content by replacing fragments
            FragmentManager fragmentManager = getSupportFragmentManager();
     
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
     
            switch (position) {
                case 0:
                    Menu1Fragment fragment1 = Menu1Fragment.newInstance();
                    fragmentTransaction.replace(R.id.container, fragment1);
                    break;

    Dans Menu1Fragment.java :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class Menu1Fragment extends Fragment {
     
        private static TabHost myTabHost;
     
        private Camera mCamera;
     
        public static Menu1Fragment newInstance() {
            Menu1Fragment fragment = new Menu1Fragment();
            return fragment;
        }
     
        public Menu1Fragment() {
        }
     
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_menu1, container, false);
            loadHome(rootView);
            return rootView;
        }
    public void loadHome(final View view) {
            // Recuperation du TabHost
            myTabHost = (TabHost) view.findViewById(R.id.TabHost01);
            // Before adding tabs, it is imperative to call the method setup()
            myTabHost.setup();
     
            // Adding tabs
            // --- tab1 settings
            addTabs(view, "tab_1", getString(R.string.tab1), R.drawable.tab1, R.id.tab1);
     
            addTabs(view, "tab_2", getString(R.string.tab2), R.drawable.tab2, R.id.tab2);
            addTabs(view, "tab_3", getString(R.string.tab3), R.drawable.tab3, R.id.tab3);
            addTabs(view, "tab_4", getString(R.string.tab4), R.drawable.tab4, R.id.tab4);
    }
    private void addTabs(View view, String tag, String str, Integer drawable, Integer vR) {
            TabHost.TabSpec specTab = myTabHost.newTabSpec(tag);
            specTab.setIndicator( setTabIndicator(view, str, drawable) );
     
            //intent = new Intent(view.getContext(), cclass);
     
            //specTab.setContent(intent);
            specTab.setContent(vR);
     
            //spec1.setContent(R.id.tab1);
            myTabHost.addTab(specTab);
     
        }
    Dans le XML de celui qu'on appel : addTabs(view, "tab_3", getString(R.string.tab3), R.drawable.tab3, R.id.tab3);

    J'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <fragment
            android:id="@+id/types_commande_fragment"
            android:name="fr.PROJET.Fragments.Commandes.TypesCommandeFragment"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            tools:layout="@layout/fragment_types_commande" />
    Et donc dans TypesCommandeFragment.java :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View rootView = inflater.inflate(R.layout.fragment_types_commande, container, false);
     
            MyAdapterTypesCommande adapterTypeCommandes = new MyAdapterTypesCommande(rootView.getContext(), generateDataTypesCommande());
     
            ListView listViewTypesCommande = (ListView) rootView.findViewById(R.id.listViewTypesCommande);
     
            listViewTypesCommande.setAdapter(adapterTypeCommandes);
     
            listViewTypesCommande.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
     
                    ItemTypeCommande item= (ItemTypeCommande) parent.getAdapter().getItem(position);
     
                    Integer statut = item.getStatut();
                    traitementStatuts(view, statut);
                }
            });
     
            return rootView;
            //return inflater.inflate(R.layout.fragment_types_commande, container, false);
        }
    private void traitementStatuts(View v, Integer statut) {
            Fragment newFragment = new ErrorStatutFragment();
     
     
            switch (statut) {
                case 100:
                    newFragment = new Statut100Fragment();
                    //Statut100Fragment
                    break;
                case 200:
                    break;
                case 300:
                    break;
                case 400:
                    break;
                case 500:
                    break;
            }
     
            FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack if needed
            transaction.replace(R.id.types_commande_fragment, newFragment);
            transaction.addToBackStack(null);
     
            // Commit the transaction
            transaction.commit();
     
     
     
        }
    Et cela me met le nouveau fragment bien en dessus de l'autre.…

    Désolé pour ce long code ….

Discussions similaires

  1. [Etat] Valeurs non visibles sur toutes les pages
    Par wperezrobles dans le forum IHM
    Réponses: 6
    Dernier message: 17/10/2006, 15h12
  2. [css]ecrire sur toutes les pages
    Par despe59 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/06/2006, 15h01
  3. Réponses: 9
    Dernier message: 29/03/2006, 22h41
  4. La date sur toutes les pages
    Par philippef dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 07/02/2006, 18h44

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