ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... ·...

19
ANDROID- IUT GEII 1 Juan BRAVO ANDROID Interagir, Naviguer

Transcript of ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... ·...

Page 1: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

ANDROID- IUT GEII

1

Juan BRAVO

ANDROID

Interagir, Naviguer

Page 2: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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

Page 3: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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

Page 4: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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

Page 5: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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);}

Page 6: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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 !!

Page 7: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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);}

Page 8: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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");

Page 9: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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)

Page 10: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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

Page 11: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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;

Page 12: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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.

Page 13: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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

Page 14: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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"

Page 15: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

ANDROID- IUT GEII 15ANDROID-IUT GEII

Toolbar

Les étapes -suite Mettre en place les items du menu

Page 16: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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

Page 17: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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);}

Page 18: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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

Page 19: ANDROID - bravo.univ-tln.frbravo.univ-tln.fr/er/Android/3-Cours Android 2017- Interagir et... · ANDROID-IUT GEII ANDROID- IUT GEII 2 Communiquer et Naviguer Intents Principes Système

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