ANDROID- IUT GEII
1
Juan BRAVO
ANDROID
Interagir, Naviguer
ANDROID- IUT GEII 2ANDROID-IUT GEII
Communiquer et Naviguer
Intents Principes Système de communication interne du système Android
basée sur l’envoi et la réception de messages exprimant l’intention d’une action
émis à destination d’un autre composant de la même application (une activité, un service, etc.) ou celui d’une toute autre application.
Applications Démarrer un service ou une activité
Navigation au sein de votre application
Annoncer qu'un évenement est survenu
Connexion internet perdu, batterie faible …
Effectuer une action par une activité ou un service sur une ensemble de données particulier
Appel automatique à partir d'un contact de ma base Contact
ANDROID- IUT GEII 3ANDROID-IUT GEII
Communiquer et Naviguer
Constitution du message Intent Composé par 3 champs
Action
– Chaîne de caractères qui indique le type d’action recherché Catégorie
– Chaîne de caractères qui indique la catégorie de l’activité recherchée Donnée ou Type
– Chaîne de caractères et Uri qui indiquent la donnée transmise à l’activité ou type de réponse attendu
Peut contenir les paramètres passés et/ou renvoyés à l’activité lancée
Exemple d'intent implicite
action.ACTION_PICK
CONTACTS
Le contact choisi
ANDROID- IUT GEII 4ANDROID-IUT GEII
Communiquer et Naviguer
Intents implicites Délégue le traitement (ou non) de la demande au composant le plus
approprié
Le système lancera l'activité la plus apte à satisfaire la requêteIntent intent=new Intent(ACTION, [uri]);startActivity(intent);
URI : Uniform Resource IdentifierGénéralise la notion d’URLSchéma générique = scheme://host:port/path
Quelques actions natives usuelles
– android.intent.action.CALL appel téléphonique
– android.intent.action.EDIT affichage de données pour
édition par l’utilisateur
– android.intent.action.MAIN activité principale d’une
application
– android.intent.action.VIEW affichage de données
– android.intent.action.WEB_SEARCH recherche sur le WEB
//Exemple : visualiser une page internetUri chemin = Uri.parse("http://www.google.fr");Intent naviguer = new Intent(Intent.ACTION_VIEW, chemin);startActivity(naviguer);
//Exemple : appeler un n° de téléphone :Uri numero = Uri.parse("tel:0123456789");Intent appeler = new Intent(Intent.ACTION_CALL, numero);startActivity(appeler);
//Exemple : choisir un contact parmi mon annuaire private static final int PICK_CONTACT_SUBACTIVITY = 2;private void startSubActivityImplicitly() {Uri uri = Uri.parse(“content://contacts/people”);Intent intent = new Intent(Intent.ACTION_PICK, uri);startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
StartActivityForResult car une donnée est attendu en retour
ANDROID- IUT GEII 5ANDROID-IUT GEII
Communiquer et Naviguer
Intents explicites Cible une activité particulière à lancer
Par exemple navigation dans votre application
Intent intent=new Intent(MyActivity.this,ActivityTwo.class)
startActivity(intent)
<Button android:id="@+id/button1" …......
android:onClick="clickHandlerNav"
/>
public class NavSimple extends Activity {
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.nav_simple);}
public void clickHandlerNav(View target){Intent intent=new Intent(this,PageLogin.class);startActivity(intent);}
ANDROID- IUT GEII 6ANDROID-IUT GEII
Communiquer et Naviguer
INTENTS ET MANIFEST NE PAS OUBLIER DE DECLARER TOUTES LES ACTIVITES DE VOTRE
APPLICATION <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.navigationsimple.NavSimple" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".PageLogin" /> </application>
Point d'entrée de votre application
Si oubli !!!!
MERCI logcat !!
ANDROID- IUT GEII 7ANDROID-IUT GEII
Communiquer et Naviguer
TRANSMETTRE DES DONNEES Les Intent peuvent aussi transporter des données qu’une application veut
transmettre à une autre application
Activité appelante : intent.putExtra(key,value);
// Button Handler : set up message to transmit and start new Activity public void handlerClick(View view){ // Handler is set in layout :android:onClick="handlerClick"Intent intent= new Intent(getApplication(), PageLogin.class);TextView loginField=(TextView)findViewById(R.id.saisielogin);TextView passwordField=(TextView)findViewById(R.id.saisiepassword);intent.putExtra("KEYLOGIN",loginField.getText().toString());intent.putExtra("KEYPASSWORD",passwordField.getText().toString());startActivity(intent);}
ANDROID- IUT GEII 8ANDROID-IUT GEII
Communiquer et Naviguer
RECUPERER DES DONNEES Utilisation de la clé pour l'adressage
Activité appelée: intent.getXXXExtra(key);
public class PageLogin extends Activity {
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
Intent intentrecup= getIntent();String loginTxt= intentrecup.getStringExtra("KEYLOGIN");String passwordTxt= intentrecup.getStringExtra("KEYPASSWORD");
String str="les arguments passés sont: "+loginTxt + " et "+ passwordTxt;
TextView dynamicTxt= new TextView(this);dynamicTxt.setText(str);dynamicTxt.setTextColor(Color.MAGENTA);dynamicTxt.setTypeface(null, Typeface.BOLD_ITALIC);
setContentView(dynamicTxt);}
Dans cet exemple aucun layout xml n'a été définiL'écran se résume à 1 seul TextView
AlternativeUtilisation de la classe BundleBundle params = getIntent().getExtras()String loginTxt= params.getString("KEYLOGIN");
ANDROID- IUT GEII 9ANDROID-IUT GEII
Communiquer et Naviguer
SOUS-ACTIVITES Activité parent démarrant une activité fille (sous-activité)
Le parent attend un résultat en retour
Les étapes :
Création de l'intent + Passage de valeur
Activité Parent
● Création de l'intent + « Bundle Aller »
● Lancement de la sous-activité
● Gestionnaire pour l'interception du résultat retour
Activité Fille
● Récupération de l'Intent + extraction « Bundle Aller»
● Traitement● Création Bundle Retour● Fin Activité Et Renvoie Bundle
startActivityForResult(intent,ID_REQUEST_CODE);
protected void onActivityResult(int requestCode, int resultCode, Intent data)
ANDROID- IUT GEII 10ANDROID-IUT GEII
Communiquer et Naviguer
Exemple
22
// Button Handler : set up message to transmit and start new Activity// Handler is set in layout :android:onClick="handlerClick"public void handlerClick(View view){ Intent i = new Intent(this, PageSaisie.class);startActivityForResult(i, ID_REQUEST_CODE);}
public class MainActivity extends Activity{final int ID_REQUEST_CODE=0;…......
protected void onActivityResult(int requestCode, int resultCode, Intent data) {TextView txt=(TextView) findViewById(R.id.textViewResult);
if (requestCode == ID_REQUEST_CODE) {
if(resultCode == RESULT_OK){ String result=data.getStringExtra("result"); txt.setText(result); } if (resultCode == RESULT_CANCELED) { Toast.makeText(getApplicationContext(), "Saisie annulée. Merci de saisir age de nouveau", Toast.LENGTH_SHORT).show(); } }}//onActivityResult
CODE PARENT
ANDROID- IUT GEII 11ANDROID-IUT GEII
Communiquer et Naviguer
Exemple suitepublic class PageSaisie extends Activity implements OnClickListener{
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.input_data_page);// Handler settingfindViewById(R.id.btnValid).setOnClickListener(this);findViewById(R.id.btnCancel).setOnClickListener(this);}
@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btnValid:EditText input=(EditText)findViewById(R.id.saisieAge);if (input.getText().length()>0){Intent returnIntent = new Intent();returnIntent.putExtra("result",input.getText().toString());setResult(RESULT_OK,returnIntent); finish();}break;case R.id.btnCancel:setResult(RESULT_CANCELED);finish();}}
CODE SOUS-ACTIVITE
NE PAS OUBLIER DE DECLARER TOUTES LES ACTIVITES DE VOTRE APPLICATION DANS LE MANIFESTE
Pas d'intent transmis dans cette exemple. Sinon placer votre getIntent() dans OnCreate
Des codes résultats prédéfinis sont accessibles grâce à import android.app.Activity;
ANDROID- IUT GEII 12ANDROID-IUT GEII
Toolbar
Menu Une nouvelle classe : ToolBar
Introduit avec Lolliloop -API 21
ToolBar vient remplacer ActionBar
Rétrocompatibilité
Utilisation de la classe android.support.v7.widget.Toolbar
Utilisation de AppCompatActivity au lieu de Activity
Plusieurs modes de fonctionnement
Comme un ActionBar : menu classique
– Détaillé après Menu généralisé : Toolbar
– Toobar est en fait un ViewGroup– Animated Toolbar, Collapsed ToolBar..
[1] app icone, [2] action items, et [3] action supplémentaires.
ANDROID- IUT GEII 13ANDROID-IUT GEII
Toolbar
Les étapes pour Toolbar en ActionBar Mettre en place la rétrocompatibilité
Ajouter dans build.gradle compile 'com.android.support:appcompat-v7:25.3.1'
Gérer les styles
Values-v21optionnel mais bonne pratique
Désactive le theme ActionBar afin d’inhiber l’instanciation de la classe ActionBar
ANDROID- IUT GEII 14ANDROID-IUT GEII
Toolbar
Les étapes (suite) Créer un layout réutilisable
Prévoir un layout-v21 (optionnel , bonne pratique)
Même fichier avec un attribut supplémentaire utilisable pour les API>21
android:elevation="5dp"
ANDROID- IUT GEII 15ANDROID-IUT GEII
Toolbar
Les étapes -suite Mettre en place les items du menu
ANDROID- IUT GEII 16ANDROID-IUT GEII
Toolbar
Les étapes - suite Styler votre toolbar (optionnel)
Dans styles.xml du répertoire values
<style name="ToolbarTheme" parent="@style/ThemeOverlay.AppCompat.ActionBar"> <!-- android:textColorPrimary is the color of the title text in the Toolbar --> <item name="android:textColorPrimary">@android:color/holo_red_light</item> <item name="android:background">@android:color/holo_green_dark</item>
</style>
<!-- This configures the styles for the title within the Toolbar --><style name="PopUpMainToobar" parent="ThemeOverlay.AppCompat.Light"> <item name="android:textColorPrimary">@android:color/holo_green_dark</item> <item name="android:background">@android:color/white</item></style>
<!-- This configures the styles for the title within the Toolbar --><style name="Toolbar.TitleText" parent="TextAppearance.Widget.AppCompat.Toolbar.Title"> <item name="android:textSize">21sp</item> <item name="android:textStyle">italic</item></style>
Toolbar
ANDROID- IUT GEII 17ANDROID-IUT GEII
Toolbar
Les étapes – suite Activer la ToolBar dans le code Java
Activation aussi du logo
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
// Find the toolbar view inside the activity layout Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // Sets the Toolbar to act as the ActionBar for this Activity window. // Make sure the toolbar exists in the activity and is not null setSupportActionBar(toolbar); // Set ToolBar Title getSupportActionBar().setTitle("Hello"); toolbar.setSubtitle("iut");
// Display icon in the toolbar getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setLogo(R.mipmap.ustv_app_icon); getSupportActionBar().setDisplayUseLogoEnabled(true);}
ANDROID- IUT GEII 18ANDROID-IUT GEII
Toolbar
Les étapes – suite Désérialiser le menu
Gabarit graphique toolbar_main_menu.xml
// Menu icons are inflated just as they were with actionbar@Overridepublic boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.toolbar_main_menu, menu); return true;}
On remarquera l'effet de la balise elevation accessible uniquement à partir de de l'API 21
ANDROID- IUT GEII 19ANDROID-IUT GEII
Toolbar
Gestion du clic@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {
case R.id.menu_edit:Intent intent1=new Intent(this, SaisieDataUser.class);startActivity(intent1);return true;
case R.id.menu_cam:Intent intent2=new Intent(this, CamDisplay.class);startActivity(intent2);return true;case R.id.menu_help:startActivity(new Intent(this, Helper.class));return true;
}return super.onOptionsItemSelected(item);}
ressources code
Pensez à implémenter dans chaque source la désérialisation + HandlerClic pour la navigationPour éviter la duplication de code une solution consisterait à hériter d'une CustomBaseActivity implémentant un menu de base commun à toutes les vues
N'oubliez pas de déclarer vos activités dans le manifest
case android.R.id.home: // special case: app icon in Action Bar clicked; go to launch activity Intent intent = new Intent(this, MainActionNav.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Gestion de l'App icone