mardi 31 décembre 2013

ANDROID ACTIONBARSHERLOCK SLIDING MENU UTILISANT NAVIGATION DRAWER COMBINE A TABS SWIPE

    Vous remarquerez que j'ai donné le Titre de ce tuto avec beaucoup de mot anglais: c'est parce que traduire ces mot reviendrait à dénaturer leur sens.
    Vous avez sans doute déjà utilisé beaucoup d'applications Android introduisant un Sliding Menu  pour naviguer entre les principaux modules de l'application. Et aussi d'autres avec des onglets dans lesquelles on se déplace en coulissant.
    Dans ce tuto, nous allons combiner ces deux fonctionnalités en utilisant la bibliothèque ActionBarSherlock.




    ActionBarSherlock

    ActionBarSherlock est une bibliothèque autonome conçu pour faciliter l'utilisation du modèle de conception de barre d'action dans toutes les versions d'Android à travers une API unique.

    La bibliothèque utilisera automatiquement la mise en œuvre de ActionBar natif sur Android 4.0 ou version ultérieure. Pour les versions antérieures qui ne comprennent pas ActionBar, une mise en œuvre de la barre d'action personnalisé basé sur les sources d'Ice Cream Sandwich sera automatiquement créée autour de la mise en page. Cela vous permet de développer facilement une application avec une barre d'action pour chaque version d'Android 2.x de et plus.

    Navigation Drawer

 

    Le Navigation Drawer est un panneau qui assure la transition à partir du bord gauche de l'écran et montre les principales options de navigation de l'application. Il est caché la plupart du temps, mais se révèle lorsque l'utilisateur glisse un doigt du bord gauche de l'écran vers la droite ou en touchant l'icone de l’application dans la barre d'action (ActionBar) en haut de l'cran.

    Swipe Views with Tabs

 

    Les Tabs Swipe fournissent une navigation latérale entre les écrans fils (Fragments) d'une même mère (ViewPager) comme des onglets avec un geste de doigt horizontal (un modèle parfois appelé pagination horizontale).

    Je vous ai donné des références plus haut pour que vous vous documentiez. Parce que avant de prétendre combiner deux élément il faut savoir les utiliser de manière distincte et pour se faire il y a des notions de base à apprendre, a savoir: qu'est-ce qu'un Fragment?, comment l'utiliser?...
Je vais vous répondre de manière très simple: Dans notre le Fragment est considéré comme une page et le ViewPager un livre composé de plusieurs pages.
   Il faut noter que l'appel et le paramétrage du ViewPager se font à partir d'un Fragment qu'on appellera Fragment Père.

    Nous allons maintenant attaquer le vif du sujet. La logique voudrait qu'on crée d'abord les écrans, mais étant donné que vous allez télécharger le code, nous allons nous attarder sur la partie java pour vous permettre de mieux comprendre les principes de base. 
    Pour ce faire, nous allons développer ensemble une petite application qui va nous permettre d'afficher un emploi du temps.
    C'est toujours le même procédé que les tutos précédents: code + commentaires inclus.

    MenuListAdapter.java

    Commençons par créer la classe MenuListAdapter.java qui hérite de la classe mère BaseAdapter qui va nous permettre de paramétrer l'affichage des élément du Sliding Menu.
    Code MenuListAdapter;java:

package com.android.app.project.dawkins;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MenuListAdapter extends BaseAdapter {

// Declare Variables
Context context;
String[] mTitle;
int[] mIcon;
LayoutInflater inflater;
public static Typeface titleFont;
boolean [] isCounterVisible; 
String [] count;

public MenuListAdapter(Context context, String[] title, int[] icon, boolean[] isCounterVisible, String[] count) {
this.context = context;
this.mTitle = title;
this.mIcon = icon;
this.isCounterVisible = isCounterVisible;
this.count = count;
}

@Override
public int getCount() {
// compte le nombre délément
return mTitle.length;
}

@Override
public Object getItem(int position) {
//génère le titre selon la position
return mTitle[position];
}

@Override
public long getItemId(int position) {
// retoure la position de l'élément
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Declare Variables
TextView txtTitle;
ImageView imgIcon;
TextView txtCount;

inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.drawer_list_item, parent,
false);

// lacalise le TextViews (titre) dans drawer_list_item.xml
txtTitle = (TextView) itemView.findViewById(R.id.menu_title);

// Localise l'icone dans drawer_list_item.xml
imgIcon = (ImageView) itemView.findViewById(R.id.menu_icon);

txtCount = (TextView) itemView.findViewById(R.id.counter);

// génère le titre selon la position
txtTitle.setText(mTitle[position]);

// génère l'image selon la position
imgIcon.setImageResource(mIcon[position]);

if(isCounterVisible[position]){
        txtCount.setText(count[position]);
        }else{
        // cache le nombre
        txtCount.setVisibility(View.GONE);
        }
return itemView;
}

}

    MainDrawer.java

 

    Construisons ensemble la classe mère de l'application qui sera appelé MainDrawer. cette classe hérite de la Classe SherlockFragmentActivity. c'est en effet la classe qui va nous permettre d'héberger toutes nos pages (Fragments) y compris le Fragement Père qui contient aussi d'autres fragments


 
    Code MainDrawer.java:

package com.android.app.project.dawkins;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.android.app.project.dawkins.fragment.FragmentHoraire;

public class MainDrawer extends SherlockFragmentActivity {

// Declare Variables
DrawerLayout mDrawerLayout;
ListView mDrawerList;
ActionBarDrawerToggle mDrawerToggle;
MenuListAdapter mMenuAdapter;
MenuItem menuSettings;
String[] title;
String[] subtitle;
int[] icon;
Fragment main = new MainMenu();
Fragment horaire = new FragmentHoraire();
private CharSequence mDrawerTitle;
private CharSequence mTitle;
private static String titreLundi, studentTitle, titreMardi,
titreJeudi, titreMercredi, titreVendredi, titreSamedi,
titreDimanche;
boolean[] isCounterVisible;
String[] count;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the view from drawer_main.xml
setContentView(R.layout.drawer_main);

getSupportActionBar().setBackgroundDrawable(
getResources().getDrawable(R.drawable.fond_blue));
// pour obtenir le titre
mTitle = mDrawerTitle = getTitle();

// Genere le titre
studentTitle = getResources().getString(R.string.title_main_menu);
titreLundi = getResources().getString(R.string.horaire_lundi);
titreMardi = getResources().getString(R.string.horaire_mardi);
titreMercredi = getResources().getString(R.string.horaire_mercredi);
titreJeudi = getResources().getString(R.string.horaire_jeudi);
titreVendredi = getResources().getString(R.string.horaire_vendredi);
titreSamedi = getResources().getString(R.string.horaire_samedi);
titreDimanche = getResources().getString(R.string.horaire_dimanche);

title = new String[] { studentTitle, titreLundi, titreMardi, titreMercredi,
titreJeudi, titreVendredi, titreSamedi, titreDimanche};

// Genere l'icone de chaque élément de la liste
icon = new int[] { R.drawable.ic_home, R.drawable.ic_timetable, R.drawable.ic_timetable,
R.drawable.ic_timetable, R.drawable.ic_timetable,
R.drawable.ic_timetable, R.drawable.ic_timetable,
R.drawable.ic_timetable };

// petit bonus pour vous 
// (affichage des nombres en face des elements de la liste comme avec google+)
isCounterVisible = new boolean[] { false, false, true, true, false, true,
false, true };
count = new String[] {"", "", "14","8" , "", "7" , "", "10" };
// localisez DrawerLayout dans drawer_main.xml
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

// localisez la ListView dans drawer_main.xml
mDrawerList = (ListView) findViewById(R.id.listview_drawer);

// active l'éffet d'hombre sur la partie de l'écran inoccupée par le slide menu 
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);

// Passer des éléments en paramettre au MenuListAdapter 
// (le context de l'application, le titre l'icone... pour chaque élément du mDrawerList)
mMenuAdapter = new MenuListAdapter(MainDrawer.this, title, icon,
isCounterVisible, count);

// définissez le MenuListAdapter pour permettre l'affichage des éléments du mDrawerList
mDrawerList.setAdapter(mMenuAdapter);

// gérer l'action du clic sur un élément du slide menu
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

// Permettre à l'icône de la bare d'action (ActionBar)
// de l'application à se comporter comme action pour afficher le slide menu
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

// ActionBarDrawerToggle regroupe les interactions appropriées
// Entre le slide menu et l'icône l'application de la barre d'action
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {

@Override
public void onDrawerClosed(View view) {
// TODO Auto-generated method stub
getSupportActionBar().setTitle(mTitle);
super.onDrawerClosed(view);
}

@Override
public void onDrawerOpened(View drawerView) {
// TODO Auto-generated method stub
// défini le titre de la barre d'action a l'ouverture du slide menu
getSupportActionBar().setTitle(mDrawerTitle);
super.onDrawerOpened(drawerView);
}
};
// Définir un listener pour être informé des événements du Drawer (slide menu).
mDrawerLayout.setDrawerListener(mDrawerToggle);
//Permet d'afficher le fragment à la position 1 à l'ouverture de l'application
if (savedInstanceState == null) {
selectItem(0);
}
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
} else {
mDrawerLayout.openDrawer(mDrawerList);
}
}
return super.onOptionsItemSelected(item);
}

// le traitement à effectuer quand l'utilisateur clic sur un élément du slide menu
private class DrawerItemClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
selectItem(position);
}
}

// methode d'affichage des fragments selon la position
// de l'élément du slide menu sélectionné
public void selectItem(int position) {
switch (position) {
case 0:
navigateTo(new MainMenu());
break;
case 1:
navigateTo(new FragmentHoraire(), "Lundi");
break;
case 2:
navigateTo(new FragmentHoraire(), "Mardi");
break;
case 3:
navigateTo(new FragmentHoraire(), "Mercredi");
break;
case 4:
navigateTo(new FragmentHoraire(), "Jeudi");
break;
case 5:
navigateTo(new FragmentHoraire(), "Vendredi");
break;
case 6:
navigateTo(new FragmentHoraire(), "Samedi");
break;
case 7:
navigateTo(new FragmentHoraire(), "Dimanche");
break;
}

// mettre en surbrillance l'élément sélectionné
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);

// afficher le titre dans la bar d'action selon la position dans la liste
setTitle(title[position]);

title = new String[] { studentTitle, titreLundi, titreMardi, titreMercredi,
titreJeudi, titreVendredi, titreSamedi, titreDimanche};
// fermer le drawer (slide menu)
mDrawerLayout.closeDrawer(mDrawerList);
}

private void create(){
// pour obtenir le titre
mTitle = mDrawerTitle = getTitle();

// Genere le titre

studentTitle = getResources().getString(R.string.title_main_menu);
titreLundi = getResources().getString(R.string.horaire_lundi);
titreMardi = getResources().getString(R.string.horaire_mardi);
titreMercredi = getResources().getString(R.string.horaire_mercredi);
titreJeudi = getResources().getString(R.string.horaire_jeudi);
titreVendredi = getResources().getString(R.string.horaire_vendredi);
titreSamedi = getResources().getString(R.string.horaire_samedi);
titreDimanche = getResources().getString(R.string.horaire_dimanche);

title = new String[] { studentTitle, titreLundi, titreMardi, titreMercredi,
titreJeudi, titreVendredi, titreSamedi, titreDimanche};

// Genere l'icone de chaque élément de la liste
icon = new int[] { R.drawable.ic_home, R.drawable.ic_timetable, R.drawable.ic_timetable,
R.drawable.ic_timetable, R.drawable.ic_timetable,
R.drawable.ic_timetable, R.drawable.ic_timetable,
R.drawable.ic_timetable };

// petit bonus pour vous 
// (affichage des nombres en face des elements de la liste comme avec google+)
isCounterVisible = new boolean[] { false, false, true, true, false, true,
false, true };
count = new String[] {"", "", "14","8" , "", "7" , "", "10" };
// localisez DrawerLayout dans drawer_main.xml
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

// localisez la ListView dans drawer_main.xml
mDrawerList = (ListView) findViewById(R.id.listview_drawer);

// active l'éffet d'hombre sur la partie de l'écran inoccupée par le slide menu 
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);

// Passer des éléments en paramettre au MenuListAdapter 
// (le context de l'application, le titre l'icone... pour chaque élément du mDrawerList)
mMenuAdapter = new MenuListAdapter(MainDrawer.this, title, icon,
isCounterVisible, count);

// définissez le MenuListAdapter pour permettre l'affichage des éléments du mDrawerList
mDrawerList.setAdapter(mMenuAdapter);

// gérer l'action du clic sur un élément du slide menu
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

// Permettre à l'icône de la bare d'action (ActionBar)
// de l'application à se comporter comme action pour afficher le slide menu
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

protected void navigateTo(Fragment fragment) {
// Voir MainMenu.java pour l'explication détaillée
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
}

protected void navigateTo(Fragment fragment, String tag) {
// Voir MainMenu.java pour l'explication détaillée
FragmentTransaction ftr = getSupportFragmentManager()
.beginTransaction();
ftr.remove(new FragmentHoraire());
ftr.commit();

Bundle args = new Bundle();

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
fragment.setArguments(null);
args.putString("tag", tag);
fragment.setArguments(args);

ft.replace(R.id.content_frame, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Synchroniser l'état du mDrawerToggle après que onRestoreInstanceState s'est produite.
mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Passer n'importe quel changement de configuration dans le mDrawerToggle
mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public void setTitle(CharSequence title) {
mTitle = title;
getSupportActionBar().setTitle(mTitle);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Obtenez l'affichage du menu optionnel de menu.xml
getSupportMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// ici on peut tout écrire avant de permettre de quitter l'application
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
finish();
}
return false;
}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
create();
mMenuAdapter.notifyDataSetChanged();
}

}

    MainMenu.java

    Nous allons maintenant créer notre Fragment principal qui n'est pas le Fragment Père mais un autre Fragment qui va nous permettre d'appeler chaque page (Fragment) appartenant au Viewpager de manière distinct. cette classe s'appelle MainMenu.java.




    Code MainMenu.java:

package com.android.app.project.dawkins;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.actionbarsherlock.app.SherlockFragment;
import com.android.app.project.dawkins.fragment.FragmentHoraire;

public class MainMenu extends SherlockFragment {
Button btnLundi;
Button btnMardi;
Button btnMercredi;
Button btnJeudi;
Button btnVendredi;
Button btnSamedi;
Button btnDimanche;
Button btnSite;

MainDrawer mainDrawer;
Fragment horaire = new FragmentHoraire();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// l'equivalent du SetContentView dans les fragement
// pour indexer la Layout principale
View v = inflater.inflate(R.layout.main_menu, container, false);
// affichage du titre dans la bare d'action (ActionBar)
// on utilise getActivity() pour se referer à l'activité principale (MainDraw)
// a laquelle appartient notre MainMenu
getActivity().setTitle(
getResources().getString(R.string.title_main_menu));
super.onCreate(savedInstanceState);

btnLundi = (Button) v.findViewById(R.id.buttonLundi);
btnMercredi = (Button) v.findViewById(R.id.buttonMercredi);
btnMardi = (Button) v.findViewById(R.id.buttonMardi);
btnVendredi = (Button) v.findViewById(R.id.buttonVendredi);
btnJeudi = (Button) v.findViewById(R.id.buttonJeudi);
btnSamedi = (Button) v.findViewById(R.id.buttonSamedi);
btnDimanche = (Button) v.findViewById(R.id.buttonDimanche);
btnSite = (Button) v.findViewById(R.id.btnSite);

btnLundi.setOnClickListener(new View.OnClickListener() {
//au clic sur le Button Lundi on affiche le fragment Lundi
// c'est valable pour tous les autre fragments
@Override
public void onClick(View v) {
navigateTo(horaire, "Lundi");
}
});
btnMardi.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
navigateTo(horaire, "Mardi");
}
});
btnMercredi.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
navigateTo(horaire, "Mercredi");
}
});

btnJeudi.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
navigateTo(horaire, "Jeudi");
}
});

btnVendredi.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
navigateTo(horaire, "Vendredi");
}
});

btnSamedi.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
navigateTo(horaire, "Samedi");
}
});

btnDimanche.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
navigateTo(horaire, "Dimanche");
}
});

btnSite.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Uri uriUrl = Uri
.parse("http://android-app-project.blogspot.com/");
Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
startActivity(launchBrowser);
}
});
return v;
}

protected void navigateTo(Fragment fragment, String tag) {
//on retire le fragment si il existait avant qu'on le rappel à nouveau
FragmentTransaction ftr = getFragmentManager().beginTransaction();
ftr.remove(new FragmentHoraire());
ftr.commit();
//on Crée un Bundle qui va contenir notre tag
// le bundle est notre argument il nous sert 
// a conserver une valeur et la communiquer a un autre fragment
Bundle args = new Bundle();
//proceccus d'affectation de l'argument
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
//on initialise l'argument
fragment.setArguments(null);
// affectation du nom du fragment qu'on veux afficher au fragment principal
args.putString("tag", tag);
fragment.setArguments(args);
//affichage du frament
ft.replace(R.id.content_frame, fragment);
//on lui appkique un effet TRANSIT_FRAGMENT_FADE au moment de la transition 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
//ne pas sauvegarger le fragment dans la mémoire cache
ft.addToBackStack(null);
ft.commit();
}

@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
getActivity().setTitle(
getResources().getString(R.string.title_main_menu));
}
}

    HorairePagerAdapter.java

    Cette classe hérite de la classe FragmentPagerAdapter et permet le parametrage du ViewPager qui sera déclaré dans le Fragment Père. C'est le constructeur du ViewPager, il sert à déterminer le nombre de page, le titre de chaque page et la position des pages.

   Code HorairePagerAdapter.java:


package com.android.app.project.dawkins;

import com.android.app.project.dawkins.fragment.HoraireDimanche;
import com.android.app.project.dawkins.fragment.HoraireJeudi;
import com.android.app.project.dawkins.fragment.HoraireLundi;
import com.android.app.project.dawkins.fragment.HoraireMardi;
import com.android.app.project.dawkins.fragment.HoraireMercredi;
import com.android.app.project.dawkins.fragment.HoraireSamedi;
import com.android.app.project.dawkins.fragment.HoraireVendredi;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class HorairePagerAdapter extends FragmentPagerAdapter{

// PAGE_COUNT recoit le nombre exact de fragment que va contenir notre ViewPager
final int PAGE_COUNT = 7;
private String titles[] = null;
/** Constructor of the class */
public HorairePagerAdapter(FragmentManager fm) {
super(fm);
// les titres des fragment
titles = new String[] { "LUNDI", "MARDI", "MERCREDI",
"JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE"};

}

/** Cette méthode sera appelée lorsque une page est demandée
*  à la création dans le onCreateView du FragmentHoraire */
@Override
public Fragment getItem(int arg0) {
Bundle data = new Bundle();
switch(arg0){
case 0:
HoraireLundi lundi = new HoraireLundi();
data.putInt("current_page", arg0+1);
lundi.setArguments(data);
return lundi;

case 1:
HoraireMardi mardi = new HoraireMardi();
data.putInt("current_page", arg0+1);
mardi.setArguments(data);
return mardi;

case 2:
HoraireMercredi mercredi = new HoraireMercredi();
data.putInt("current_page", arg0+1);
mercredi.setArguments(data);
return mercredi;

case 3:
HoraireJeudi jeudi = new HoraireJeudi();
data.putInt("current_page", arg0+1);
jeudi.setArguments(data);
return jeudi;

case 4:
HoraireVendredi vendredi = new HoraireVendredi();
data.putInt("current_page", arg0+1);
vendredi.setArguments(data);
return vendredi;

case 5:
HoraireSamedi samedi = new HoraireSamedi();
data.putInt("current_page", arg0+1);
samedi.setArguments(data);
return samedi;

case 6:
HoraireDimanche dimanche = new HoraireDimanche();
data.putInt("current_page", arg0+1);
dimanche.setArguments(data);
return dimanche;
}
return null;
}

/** Retourne le nombre de page */
@Override
public int getCount() {
return PAGE_COUNT;
}

@Override
public CharSequence getPageTitle(int position) {
// retourne le titre de la page selon la position
return titles[position];
}
}

    FragmentHoraire.java

    C'est le Fragment Père, jusque là nous ne faisons que parler de cette classe dans laquelle on déclare le ViewPager. vous savez déjà tout, pas besoin d'explication. passons au code:

    Code FragmentHoraire.java:

package com.android.app.project.dawkins.fragment;

import java.lang.reflect.Field;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.actionbarsherlock.app.SherlockFragment;
import com.android.app.project.dawkins.HorairePagerAdapter;
import com.android.app.project.dawkins.R;

public class FragmentHoraire extends SherlockFragment {
ViewPager mViewPager;
String sjour;
String tag;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.horaire_pager, container, false);
// Localisez le ViewPager dans horairepager.xml
mViewPager = (ViewPager) view.findViewById(R.id.pager);

// Définissez le ViewPagerAdapter dans ViewPager
mViewPager.setAdapter(new HorairePagerAdapter(getChildFragmentManager()));
// Récupérer l'argument qui provient du Fragment MainMenu.java
Bundle bundle = getArguments();
tag = bundle.getString("tag");
Log.i("tag", tag);
// AFfichage d'un Fragment selon le contenu de l'argument recu
if (tag.equalsIgnoreCase("Lundi")) {
mViewPager.setCurrentItem(0);
getActivity().setTitle(getResources().getString(R.string.horaire_lundi));
} else if (tag.equalsIgnoreCase("Mardi")) {
mViewPager.setCurrentItem(1);
getActivity().setTitle(getResources().getString(R.string.horaire_mardi));
} else if (tag.equalsIgnoreCase("Mercredi")) {
mViewPager.setCurrentItem(2);
getActivity().setTitle(getResources().getString(R.string.horaire_mercredi));
} else if (tag.equalsIgnoreCase("Jeudi")) {
getActivity().setTitle(getResources().getString(R.string.horaire_jeudi));
mViewPager.setCurrentItem(3);
} else if (tag.equalsIgnoreCase("Vendredi")) {
getActivity().setTitle(getResources().getString(R.string.horaire_vendredi));
mViewPager.setCurrentItem(4);
} else if (tag.equalsIgnoreCase("Samedi")) {
getActivity().setTitle(getResources().getString(R.string.horaire_samedi));
mViewPager.setCurrentItem(5);
} else if (tag.equalsIgnoreCase("Dimanche")) {
getActivity().setTitle(getResources().getString(R.string.horaire_dimanche));
mViewPager.setCurrentItem(6);
}

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
// changer le titre dans la bare d'action a chaque sélection
TitreFragment();
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
// changer le titre dans la bare d'action a chaque fois
// que l'utilisateur glisse la main sur l'écran
// pour passer d'un ecran a un autre
TitreFragment();
}

@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
// changer le titre dans la bare d'action chaque changement de fragment
TitreFragment();
}
});
return view;
}

@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class
.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}

@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
TitreFragment();
}

// changer le titre dans la bare d'action
private void TitreFragment(){
if(mViewPager.getCurrentItem()==0){
sjour = "Lundi";
}else if(mViewPager.getCurrentItem()==1){
sjour = "Mardi";
}else if(mViewPager.getCurrentItem()==2){
sjour = "Mercredi";
}else if(mViewPager.getCurrentItem()==3){
sjour = "Jeudi";
}else if(mViewPager.getCurrentItem()==4){
sjour = "Vendredi";
}else if(mViewPager.getCurrentItem()==5){
sjour = "Samedi";
}else if(mViewPager.getCurrentItem()==6){
sjour = "Dimanche";
}
getActivity().setTitle(sjour);
}

}

    HoraireLundi.java

    Enfin je vous donne le code du Premier fragment HoraireLundi.java c'est le même code jusqu'a Dimanche et il est tres simple. :)

   Code HoraireLundi.java:

package com.android.app.project.dawkins.fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.actionbarsherlock.app.SherlockFragment;
import com.android.app.project.dawkins.R;

public class HoraireLundi extends SherlockFragment {
TextView tjour;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View v = inflater.inflate(R.layout.horaire_lundi, container, false);
return v;
}
}









1 commentaire:

  1. Betway and Betway casino and sports betting app - JamBase
    The Betway app offers the latest 전라북도 출장안마 sports betting odds, the fastest Payouts & 충청북도 출장샵 In-Play and a huge Welcome Bonus. Betway Casino - 수원 출장안마 Slots 세종특별자치 출장마사지 - Table Games - Roulette - Blackjack. 순천 출장안마

    RépondreSupprimer