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

Composants graphiques Android Discussion :

Tabbed Activity template + fragment & layout associé


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de vertebre
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 184
    Par défaut Tabbed Activity template + fragment & layout associé
    Bonsoir,


    J'ai testé d'utiliser l'activité TabbedActivity par default(template) d'android studio, et çà me plait bien.
    Juste j'ai compris que l'activité possède 3 fragments mais je n'arrive pas à assigner/appliquer des layouts particuliers pour chaque fragment.


    Voici le code de cette activité et de son layout:


    MainTabbedActivity.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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    package novtonrak.perstud.com.novtonrak;
     
    import android.content.Intent;
    import android.support.design.widget.TabLayout;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
     
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
     
    import android.view.Window;
    import android.widget.TextView;
     
     
    public class MainTabbedActivity extends AppCompatActivity {
     
        /**
         * The {@link android.support.v4.view.PagerAdapter} that will provide
         * fragments for each of the sections. We use a
         * {@link FragmentPagerAdapter} derivative, which will keep every
         * loaded fragment in memory. If this becomes too memory intensive, it
         * may be best to switch to a
         * {@link android.support.v4.app.FragmentStatePagerAdapter}.
         */
        private SectionsPagerAdapter mSectionsPagerAdapter;
     
        /**
         * The {@link ViewPager} that will host the section contents.
         */
        private ViewPager mViewPager;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main_tabbed);
     
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            // Create the adapter that will return a fragment for each of the three
            // primary sections of the activity.
            mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
     
            // Set up the ViewPager with the sections adapter.
            mViewPager = (ViewPager) findViewById(R.id.container);
            mViewPager.setAdapter(mSectionsPagerAdapter);
     
            TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
            tabLayout.setupWithViewPager(mViewPager);
     
            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                }
            });
     
        }
     
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main_tabbed, menu);
            return true;
        }
     
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
     
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                Intent i = new Intent(MainTabbedActivity.this, SettingsActivity.class);
                startActivity(i);
                return true;
            }
     
            return super.onOptionsItemSelected(item);
        }
     
        /**
         * A placeholder fragment containing a simple view.
         */
        public static class PlaceholderFragment extends Fragment {
            /**
             * The fragment argument representing the section number for this
             * fragment.
             */
            private static final String ARG_SECTION_NUMBER = "section_number";
     
            public PlaceholderFragment() {
            }
     
            /**
             * Returns a new instance of this fragment for the given section
             * number.
             */
            public static PlaceholderFragment newInstance(int sectionNumber) {
                PlaceholderFragment fragment = new PlaceholderFragment();
                Bundle args = new Bundle();
                args.putInt(ARG_SECTION_NUMBER, sectionNumber);
                fragment.setArguments(args);
                return fragment;
            }
     
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main_tabbed, container, false);
                TextView textView = (TextView) rootView.findViewById(R.id.section_label);
                textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
                return rootView;
            }
        }
     
        /**
         * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
         * one of the sections/tabs/pages.
         */
        public class SectionsPagerAdapter extends FragmentPagerAdapter {
     
            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }
     
            @Override
            public Fragment getItem(int position) {
                // getItem is called to instantiate the fragment for the given page.
                // Return a PlaceholderFragment (defined as a static inner class below).
                return PlaceholderFragment.newInstance(position + 1);
            }
     
            @Override
            public int getCount() {
                // Show 3 total pages.
                return 3;
            }
     
            @Override
            public CharSequence getPageTitle(int position) {
                switch (position) {
                    case 0:
                        return "Derniers Nable";
                    case 1:
                        return "Déposer un Nable";
                    case 2:
                        return "Mes infonab";
                }
                return null;
            }
        }
    }
    fragment_main_tabbed.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
    <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="novtonrak.perstud.com.novtonrak.MainTabbedActivity$PlaceholderFragment">
     
        <TextView
            android:id="@+id/section_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
     
    </RelativeLayout>

    Bonne soirée et merci par avance de votre aide

  2. #2
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Salut,

    je pense que pour avoir ce que tu cherches à faire, il te faudra créer pour chaque partie un fragment séparément. Dans ce cas, tu pourras associer à chaque fragment son layout et dans l'adaptateur qui gère l'affichage des fragment tu vérifies le numéro et tu affiches le fragment correspondant


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  3. #3
    Membre confirmé Avatar de vertebre
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 184
    Par défaut
    En fait j'ai à peu près compris le principe mais c'est l'endroit où placer le code où je bloque.

    J'ai déjà créer mes fragments de base avec android studio.


    fragment1.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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    package novtonrak.perstud.com.novtonrak;
     
    import android.content.Context;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
     
     
    /**
     * A simple {@link Fragment} subclass.
     * Activities that contain this fragment must implement the
     * {@link FavFragment.OnFragmentInteractionListener} interface
     * to handle interaction events.
     * Use the {@link FavFragment#newInstance} factory method to
     * create an instance of this fragment.
     */
    public class FavFragment extends Fragment {
        // TODO: Rename parameter arguments, choose names that match
        // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
        private static final String ARG_PARAM1 = "param1";
        private static final String ARG_PARAM2 = "param2";
     
        // TODO: Rename and change types of parameters
        private String mParam1;
        private String mParam2;
     
        private OnFragmentInteractionListener mListener;
     
        public FavFragment() {
            // Required empty public constructor
        }
     
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment FavFragment.
         */
        // TODO: Rename and change types and number of parameters
        public static FavFragment newInstance(String param1, String param2) {
            FavFragment fragment = new FavFragment();
            Bundle args = new Bundle();
            args.putString(ARG_PARAM1, param1);
            args.putString(ARG_PARAM2, param2);
            fragment.setArguments(args);
            return fragment;
        }
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments() != null) {
                mParam1 = getArguments().getString(ARG_PARAM1);
                mParam2 = getArguments().getString(ARG_PARAM2);
            }
        }
     
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_fav, container, false);
        }
     
        // TODO: Rename method, update argument and hook method into UI event
        public void onButtonPressed(Uri uri) {
            if (mListener != null) {
                mListener.onFragmentInteraction(uri);
            }
        }
     
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            if (context instanceof OnFragmentInteractionListener) {
                mListener = (OnFragmentInteractionListener) context;
            } else {
                throw new RuntimeException(context.toString()
                        + " must implement OnFragmentInteractionListener");
            }
        }
     
        @Override
        public void onDetach() {
            super.onDetach();
            mListener = null;
        }
     
        /**
         * This interface must be implemented by activities that contain this
         * fragment to allow an interaction in this fragment to be communicated
         * to the activity and potentially other fragments contained in that
         * activity.
         * <p>
         * See the Android Training lesson <a href=
         * "http://developer.android.com/training/basics/fragments/communicating.html"
         * >Communicating with Other Fragments</a> for more information.
         */
        public interface OnFragmentInteractionListener {
            // TODO: Update argument type and name
            void onFragmentInteraction(Uri uri);
        }
    }
    fragment2.java
    fragment3.java
    J'ai également leur layout associé:

    layout_fragment1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <FrameLayout 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"
        tools:context="novtonrak.perstud.com.novtonrak.InfosNoveFragment">
     
        <!-- TODO: Update blank fragment layout -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/hello_blank_fragment" />
     
    </FrameLayout>
    layout_fragment2
    layout_fragment3
    Dans chaque fragment.java j'ai une interface avec une procédure que ma MainTabbedActivity.java doit implémenter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void onFragmentInteraction(Uri uri);
    Puis dans mon MainTabbedActivity.java j'ai mon adapter
    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
    /**
         * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
         * one of the sections/tabs/pages.
         */
        public class SectionsPagerAdapter extends FragmentPagerAdapter {
     
            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }
     
            @Override
    // renvoie l'item à la position passée en paramètre
            public Fragment getItem(int position) {
                // getItem is called to instantiate the fragment for the given page.
                // Return a PlaceholderFragment (defined as a static inner class below).
                return PlaceholderFragment.newInstance(position + 1);
            }
     
            @Override
    // Renvoie le nombre de fragment
            public int getCount() {
                // Show 3 total pages.
                return 3;
            }
     
            @Override
    Renvoie le titre de la page(fragment) de la position passée en paramètre
            public CharSequence getPageTitle(int position) {
                switch (position) {
                    case 0:
                        return "Derniers Nable";
                    case 1:
                        return "Déposer un Nable";
                    case 2:
                        return "Mes infonab";
                }
                return null;
            }
        }
    A ce moment je me dis que çà se passe dans "public Fragment getItem(int position)" et dans cette procédure "void onFragmentInteraction(Uri uri)" mais je ne comprend toujours pas la logique du code ou comment le modifier pour insérer mes fragments dans mon adapter ...

  4. #4
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Bonjour,

    Citation Envoyé par vertebre Voir le message
    En fait j'ai à peu près compris le principe mais c'est l'endroit où placer le code où je bloque.
    Tu dois placer ton code dans l'adaptateur qui affiche les fragments selon le numéro. Dans la méthode getItem(int position), en fonction de la position, tu instancies le fragment correspondant. voici une illustration :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            @Override
            // renvoie l'item à la position passée en paramètre
            public Fragment getItem(int position) {
                // getItem is called to instantiate the fragment for the given page.
                // Return a PlaceholderFragment (defined as a static inner class below).
                 switch (position) {
                    case 0:
                        return new fragment1();
                    case 1:
                        return return new fragment2();
                    case 2:
                        return return new fragment3();
                }
            }


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  5. #5
    Membre confirmé Avatar de vertebre
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 184
    Par défaut
    Bonjour,

    merci pour ton illustration, c'est exactement çà que je voulais savoir et çà marche !

    Peut être pourrais tu m'en dire plus sur l'utilité de la procédure "void onFragmentInteraction(Uri uri)" que la MainFragmentActivity doit implémenter ?
    J'ai crée un nouveau fichier contenant l'interface "OnFragmentInteractionListener" pour éviter de l'avoir dans chacun des mes fragments. Pourrais tu me confirmer qu'il n'ai pas nécessaire de le déclarer dans chaque Fragment stp ?

    bonne soirée,

  6. #6
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Bonjour,

    Citation Envoyé par vertebre Voir le message
    Bonjour,

    merci pour ton illustration, c'est exactement çà que je voulais savoir et çà marche !

    Peut être pourrais tu m'en dire plus sur l'utilité de la procédure "void onFragmentInteraction(Uri uri)" que la MainFragmentActivity doit implémenter ?
    J'ai crée un nouveau fichier contenant l'interface "OnFragmentInteractionListener" pour éviter de l'avoir dans chacun des mes fragments. Pourrais tu me confirmer qu'il n'ai pas nécessaire de le déclarer dans chaque Fragment stp ?

    bonne soirée,

    Pour faire simple je dirais, cette interface que tu crées dans ton fragment permet juste à ce dernier de communiquer avec les autres fragments en passant par l'activity qui les gère.

    Parce que les fragments ne peuvent s'échanger des données directement, il doit y avoir un moyen pour permettre cette manœuvre. C'est pourquoi, il est impératif pour un fragment A qui souhaite après traitement d'une commande passer le résultat au fragment B de mettre à disposition de l'activity qui gère les deux fragments une interface que cette dernière devra implémenter afin que d'un côté le fragment A envoie les données à l'activity, et de l'autre l'activity récupère les données provenant du fragment A et les passe ensuite au fragment B. De même, si le fragment B souhaite communiquer avec le fragment A (lui envoyer par exemple un petit bonjour ), il mettra à disposition de l'activity une interface et les choses se passeront comme pour le fragment A.

    Si tu as une question n'hésite pas...


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

Discussions similaires

  1. [2.x] Impossible d'inclure un template dans mon layout
    Par student_php dans le forum Symfony
    Réponses: 16
    Dernier message: 14/09/2012, 15h35
  2. menu dans Activity contenant fragment
    Par l-amoureu dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 23/04/2012, 10h14
  3. Association layout et activity
    Par l-amoureu dans le forum Composants graphiques
    Réponses: 5
    Dernier message: 11/02/2011, 19h21
  4. Stuts Layout => utilisation des tags <tabs> et <tab>
    Par spirodeau dans le forum Struts 1
    Réponses: 4
    Dernier message: 26/07/2006, 17h51

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