- Théorique
- Notes (par lui)
- Pratique
- Pas de projets complets
- Pas d’algorithmie
- Comprendre la phylosophie Android (OS)
- Fonctionnel
- Amsterdam
-
- En anglais car nom de classes
- Activity
- Intent
- Layout
- View
-
- Design des apps
- Quantificateur
-
- Base
- Unitaires
-
- Pattern UI (Interface utilisateurs) / UX (Experience utilisateurs)
- Deux Activités
- Toolbar
- Fragments (Responsive-ish)
- Adapter
- Tabs (PageViewer)
- RecyclerView
- Navigation Drawer
- SQLite
-
APK
-
- App
-
- Manifests (Config project)
- ATTENTION, si le fichier est incomplet le projet ne se compile pas
-
- build.gradle (Module: app)
- minSdkVersion 21
- versionCode 1 - Publication
- versionName “1.0” - Publication
- dependencies - Ajout de lib
- java
- Code (Prog + tests)
- res
-
- Ressources de l’app
- Icônes
- Images
- Fichiers
- Layout
- Couleurs
-
- <LinearLayout xmlns: … --> root (racine)
- …Layout --> (conteneur de mise en page)
- LinearLayout
-
Permet de placer les view les uns en dessus des autres
-
Permet de placer les view les uns à droite des autres
-
android:orientation=“vertical”
-
android:orientation=“horizontal”
-
- android:layout_width
-
- Lageur du composant
- Layout_ --> Défini par rapport au conteneur
- largeur, hauteur : match_parent (tout l’espace du conteneur)
- wrap_content : (espace de son propre contenu)
- dimensions : dp
- TextView
- Label
- android:background="#f00"
-
- Couleur de fond
- Notation hex
- android:padding=“20dp”
- Marge intérieur
- android:layout_margin=“8dp”
- Marge extrérieur
- android:text
- Text affiché
- EditText
- Zone de saisie
- android:layout_marginStart=“20dp”
- Marge gauche
- android:layout_marginEnd=“20dp”
- Marge droite
- android:hint=“Merci de saisir votre prénom” />
- Placeholder (WEB) / Message d’invite
- Button
- Bouton
- android:layout_gravity=“center”
- Positionnement dans le conteneur
- android:layout_marginTop=“20dp”
- Marge du dessus
- android:id="@+id/…"
- Identifiant pour accéder à la View depuis le code
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" tools:context=".controller.GameActivity">
<TextView android:id="@+id/activity_game_question_txt"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:textColor="@color/colorPrimary"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:textSize="18sp"
android:textStyle="bold"
android:text="Question ?"
android:gravity="center" /><Button android:id="@+id/activity_game_answer1_btn"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:textColor="@color/colorAccent"
android:layout_margin="5dp"
android:background="@android:color/white"
android:text="Answer 1"
android:textSize="20sp"/><Button android:id="@+id/activity_game_answer2_btn"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="5dp"
android:layout_weight="1"
android:background="@android:color/white"
android:textColor="@color/colorAccent"
android:text="Answer 2"
android:textSize="20sp" />
<Button android:id="@+id/activity_game_answer3_btn"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:textColor="@color/colorAccent"
android:layout_margin="5dp"
android:background="@android:color/white"
android:text="Answer 3"
android:textSize="20sp"/>
<Button android:id="@+id/activity_game_answer4_btn"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:textColor="@color/colorAccent"
android:layout_margin="5dp"
android:background="@android:color/white"
android:text="Answer 4"
android:textSize="20sp"/>
</LinearLayout>
- Fichier Manifest
-
- <Activity…
- MAIN, LAUNCHER - Activité démarrée au lancement
- Toutes lesActivity DOIVENT y être déclarée
- TextView
-
- height
- 0dp
-
- weight
- 2
- Button
-
- height
- 0dp
-
- weight
- 1
- * Automatique
- android:layout_weight (Définition du poids (l’importance))
-
- Le système additionne les poids
-
- ICI --> 6 (100%)
- TextView 2/6
- Button 1/6
-
- Fonctionne comme
- CSS Grid / Flexbox
- Pour une couleur
- FF0000
-
- @color/colorPrimary --> Couleur primaire du thème
- Variables CSS (ou Prepocessors)
- @android:color/white --> Couleur système
- android:textColor
-
- Couleur du texte
-
- CSS Equiv
- color
- android:textSize
-
- Taille de police sp
-
- CSS Equiv
- text-size
- android:textStyle
-
- bold, italic, normal
-
- CSS Equiv
- text-style
- text-weight
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".controller.MainActivity">
<!-- Label -->
<TextView
android:id="@+id/activity_main_greeting_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:paddingStart="10dp"
android:text="Bienvenue, quel est votre prénom ?" /><!-- Zone de saisie -->
<EditText
android:id="@+id/activity_main_first_name_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:hint="Merci de saisir votre prénom" />
<!-- Bouton -->
<Button
android:id="@+id/activity_main_play_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="20dp"
android:layout_marginTop="20dp"
android:text="Commencer" />
</LinearLayout>
- Lancement d’Activity
- Demande doit être faite à l’OS
- L’objet pour communiquer avec le système --> Intent (Enveloppe)
- Intent(context, class)
-
- context
-
- l’Activity actuellement en exécution (Demandeur)
- mainActivity.this
-
- class
-
- (Réflexion) Nom de l’Activity à démarrer avec le .class
- GameActivity.class
- MainActivity
-
- Commencer
- GameActivity
- MainActivity (Stop)
- Fin d’une Activity
-
- Finish();
- Met fin à l’Activity et s’il y a une autre Activity (soppée) elle redémarre
- Le tag est une information supplémentaire que l’on peut assigner à une View
- Lancement d’activity avec retour attendu
-
- (startActivityForResult)
-
- Il faut identifier l’Activity qu’on lance
- requestCode
show opening bracket vscode
package ch.ceff.android.monquiz.controller;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import ch.ceff.android.monquiz.R;
import ch.ceff.android.monquiz.model.User;/**
AppCompatActivity --> Activity compatible avec les anciennes versions */public class MainActivity extends AppCompatActivity {
/// Constantes requêtes d'Activity private static final int GAME_ACTIVITY_REQUEST_CODE = 42;
/// Constantes pour les SharedPreferences private static final String PREF_KEY_FIRST_NAME = "PREF_KEY_FIRST_NAME";
private static final String PREF_KEY_SCORE = "PREF_KEY_SCORE";/// Bind private TextView mGreetingText;
private EditText mFirstNameInput;
private Button mPlayButton;/// User private User mUser;
/// Stockage persistant private SharedPreferences mPreferences;
/// Méthode obligatoire --> Création de l'Activity @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/// Inflate le fichier XML pour construire l'interface /// R.layout.activity_main setContentView(R.layout.activity_main);/// L'utilisateur de l'app mUser = new User();
/// Récupération des sharedPreferences mPreferences = getPreferences(MODE_PRIVATE);/// Votre code à partir d'ici mGreetingText = findViewById(R.id.activity_main_greeting_txt);
mFirstNameInput = findViewById(R.id.activity_main_first_name_input);
mPlayButton = findViewById(R.id.activity_main_play_btn);/// 1) Désactivation du bouton Commencer mPlayButton.setEnabled(false);
/// Salutation du USER greetUser();
/// 2) Ecouter la zone de saisie pour détecter la composition du nom mFirstNameInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {<span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span>
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
/// Dès que la première lettre est saisie --> On active le bouton mPlayButton.setEnabled(charSequence.toString().length() != 0);}
<span class="token annotation punctuation">@Override</span>
public void afterTextChanged(Editable editable) {
<span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
/// 3) Mise en place du gestionnaire pour le bouton Commencer mPlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/// Mémoriser le prénom du User String firstName = mFirstNameInput.getText().toString();
mUser.setFirstName(firstName);/// Stockage du prénom en mémoire SharedPreferences.Editor editor = mPreferences.edit();
editor.putString(PREF_KEY_FIRST_NAME, mUser.getFirstName());
/// Validation du stockage editor.apply();/// Démarrage de la seconde activité /// 1) Création d'un Intent /// 2) Démarrage de l'Activity décrite dans l'Intent Intent gameActivity = new Intent(MainActivity.this, GameActivity.class); startActivityForResult(gameActivity, GAME_ACTIVITY_REQUEST_CODE);
// startActivity(gameActivity); }
});Log.d("MainActivity", "---> onCreate()");
}<span class="token comment">/// Cette méthode est appelée automatiquement lorsque qu'on attend un retour d'Activity </span>
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);if (GAME_ACTIVITY_REQUEST_CODE == requestCode) {
if (RESULT_OK == resultCode) {
int score = data.getIntExtra(GameActivity.BUNDLE_EXTRA_SCORE, 0);mPreferences.edit().putInt(PREF_KEY_SCORE, score).apply();
greetUser();
}
}
}<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">greetUser</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> String firstName <span class="token operator">=</span> mPreferences<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span>PREF_KEY_FIRST_NAME<span class="token punctuation">,</span> null<span class="token punctuation">)</span><span class="token punctuation">;</span>
if (firstName != null) {
int score = mPreferences.getInt(PREF_KEY_SCORE, 0);/// Faites mieux lol String message = "Vous voilà de retour, " + firstName
+ " !\nVotre dernier score est de " + score
+ ", voulez-vous l'améliorer ?";mGreetingText.setText(message);
mFirstNameInput.setText(firstName);
mFirstNameInput.setSelection(firstName.length());
mPlayButton.setEnabled(true);
}
}<span class="token annotation punctuation">@Override</span>
protected void onStart() {
super.onStart();
Log.d("MainActivity", "---> onStart()");
}<span class="token annotation punctuation">@Override</span>
protected void onResume() {
super.onResume();
Log.d("MainActivity", "---> onResume()");
}<span class="token annotation punctuation">@Override</span>
protected void onPause() {
super.onPause();
Log.d("MainActivity", "---> onPause()");
}<span class="token annotation punctuation">@Override</span>
protected void onStop() {
super.onStop();
Log.d("MainActivity", "---> onStop()");
}<span class="token annotation punctuation">@Override</span>
protected void onDestroy() {
super.onDestroy();
Log.d("MainActivity", "---> onDestroy()");
}
}
package ch.ceff.android.monquiz.controller;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;import java.util.Arrays;
import ch.ceff.android.monquiz.R;
import ch.ceff.android.monquiz.model.Question;
import ch.ceff.android.monquiz.model.QuestionBank;public class GameActivity extends AppCompatActivity implements View.OnClickListener {
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> String BUNDLE_EXTRA_SCORE <span class="token operator">=</span> <span class="token string">"BUNDLE_EXTRA_SCORE"</span><span class="token punctuation">;</span>
private TextView mQuestionText;
private Button mAnswerButton1;
private Button mAnswerButton2;
private Button mAnswerButton3;
private Button mAnswerButton4;/// Liste de questions private QuestionBank mQuestionBank;
/// Question en cours private Question mCurrentQuestion;
/// Nombre de questions de la sessions private int mNumberOfQuestions;
/// Le score du User private int mScore;/// Désactivation des clics pendant la pause private boolean mEnableTouchEvents;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);/// Préparation de la liste des questions mQuestionBank = this.generateQuestion();
mEnableTouchEvents = true;
/// Première question ? mCurrentQuestion = mQuestionBank.getQuestion();
/// Combien de questions à poser ? mNumberOfQuestions = 4;mScore = 0;
mQuestionText = findViewById(R.id.activity_game_question_txt);
mAnswerButton1 = findViewById(R.id.activity_game_answer1_btn);
mAnswerButton2 = findViewById(R.id.activity_game_answer2_btn);
mAnswerButton3 = findViewById(R.id.activity_game_answer3_btn);
mAnswerButton4 = findViewById(R.id.activity_game_answer4_btn);mAnswerButton1.setOnClickListener(this);
mAnswerButton2.setOnClickListener(this);
mAnswerButton3.setOnClickListener(this);
mAnswerButton4.setOnClickListener(this);/// Pour éviter trop de tests dans onClick --> Tag --> Index de la réponse mAnswerButton1.setTag(0);
mAnswerButton2.setTag(1);
mAnswerButton3.setTag(2);
mAnswerButton4.setTag(3);this.displayQuestion(mCurrentQuestion);
Log.d("GameActivity", "---> onCreate()");
}
<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">displayQuestion</span><span class="token punctuation">(</span>Question question<span class="token punctuation">)</span> <span class="token punctuation">{</span> mQuestionText<span class="token punctuation">.</span><span class="token function">setText</span><span class="token punctuation">(</span>question<span class="token punctuation">.</span><span class="token function">getQuestion</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mAnswerButton1.setText(question.getChoiceList().get(0));
mAnswerButton2.setText(question.getChoiceList().get(1));
mAnswerButton3.setText(question.getChoiceList().get(2));
mAnswerButton4.setText(question.getChoiceList().get(3));
}<span class="token keyword">private</span> QuestionBank <span class="token function">generateQuestion</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">/// Version 0.1 --> Question en "dur" </span>
Question question1 = new Question("Quel layout permet d'organiser les éléments horizontalement ou verticalement ?",
Arrays.asList("FrameLayout", "RelativeLayout", "LinearLayout", "ConstraintLayout"), 2);
Question question2 = new Question("Quel attribut permet de définir le sens de remplissage d'un LinearLayout ?",
Arrays.asList("layout_weight", "orientation", "hint", "id"), 1);
Question question3 = new Question("Quel élément est un label ? ",
Arrays.asList("EditText", "TextView", "ImageView", "Button"), 1);
Question question4 = new Question("Quel élément est une zone de saisie de texte ?",
Arrays.asList("Button", "TextView", "ImageView", "EditText"), 3);
Question question5 = new Question("Quel attribut utiliser pour modifier la marge intérieur d'un élément ?",
Arrays.asList("margin", "padding", "gravity", "weight"), 1);
Question question6 = new Question("Quel attribut permet de modifier la couleur de fond d'un élément ?",
Arrays.asList("textColor", "orientation", "layout_height", "background"), 3);
Question question7 = new Question("Quelle méthode est utilisée pour afficher la GUI au lancement de l'application ?",
Arrays.asList("findViewById()", "setEnabled()", "setContentView()", "toString()"), 2);
Question question8 = new Question("Quelle unité faut-il utiliser sous Android pour définir une dimension ?",
Arrays.asList("px", "in", "dp", "cm"), 2);
Question question9 = new Question("Comment s'appelle le fichier de configuration d'une application Android ?",
Arrays.asList("activity_main", "AndroidManifest", "MainActivity", "activity_game"), 1);
Question question10 = new Question("Comment définissez-vous un gestionnaire de clic sur un bouton ?",
Arrays.asList("addOnClickListener", "addTextChangedListener", "setOnCkickListener", "setKeyListener"), 2);return new QuestionBank(Arrays.asList(question1, question2, question3, question4, question5, question6, question7, question8, question9, question10));
}<span class="token annotation punctuation">@Override</span>
public void onClick(View v) {
int reponseIndex = (int) v.getTag();if (reponseIndex == mCurrentQuestion.getAnswerIndex()) {
mScore++;
Toast.makeText(this, "Correct", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Incorrect", Toast.LENGTH_SHORT).show();
}mEnableTouchEvents <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
/// Améliorer l'UX --> Pause avant d'afficher la prochaine question new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mEnableTouchEvents = true;
/// Pépare la prochaine question if (--mNumberOfQuestions == 0) {
endGame();
} else {
mCurrentQuestion = mQuestionBank.getQuestion();
displayQuestion(mCurrentQuestion);
}
}
}, 2000);/// Pépare la prochaine question // if (--mNumberOfQuestions == 0) { // endGame(); // } else { // mCurrentQuestion = mQuestionBank.getQuestion(); // displayQuestion(mCurrentQuestion); // } }
<span class="token comment">/**
Dès qu'on touche l'écran, ça c'est appelé * Méthode de dispatch des événements * @param ev
@return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return mEnableTouchEvents && super.dispatchTouchEvent(ev);
}private void endGame() {
/// Affichage d'une boîte de dialogue AlertDialog.Builder builder = new AlertDialog.Builder(this);/// Définir un titre, un message et les boutons builder.setTitle("Résultats")
.setMessage("Votre score est de " + mScore)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
/// Création d'un intent pour retourner des données Intent intent = new Intent();
/// Ajout d'une donnée (EXTRA) intent.putExtra(BUNDLE_EXTRA_SCORE, mScore);
/// Que s'est-il passé ? setResult(RESULT_OK, intent);
finish(); /// Met fin à l'Activity }
})
.setCancelable(false) /// Annule la fermeture de la boîte avec un clic en dehors .create()
.show();
}<span class="token annotation punctuation">@Override</span>
protected void onStart() {
super.onStart();
Log.d("GameActivity", "---> onStart()");
}<span class="token annotation punctuation">@Override</span>
protected void onResume() {
super.onResume();
Log.d("GameActivity", "---> onResume()");
}<span class="token annotation punctuation">@Override</span>
protected void onPause() {
super.onPause();
Log.d("GameActivity", "---> onPause()");
}<span class="token annotation punctuation">@Override</span>
protected void onStop() {
super.onStop();
Log.d("GameActivity", "---> onStop()");
}<span class="token annotation punctuation">@Override</span>
protected void onDestroy() {
super.onDestroy();
Log.d("GameActivity", "---> onDestroy()");
}
}
package ch.ceff.android.monquiz.model;
public class User {
private String mFirstName;public String getFirstName() {
return mFirstName;
}<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setFirstName</span><span class="token punctuation">(</span>String firstName<span class="token punctuation">)</span> <span class="token punctuation">{</span> mFirstName <span class="token operator">=</span> firstName<span class="token punctuation">;</span>
}
<span class="token annotation punctuation">@Override</span>
public String toString() {
return "User{" +
"mFirstName='" + mFirstName + ''' +
'}';
}
}
package ch.ceff.android.monquiz.model;
import java.util.List;
public class Question {
<span class="token keyword">private</span> String mQuestion<span class="token punctuation">;</span>
private List<String> mChoiceList;
private int mAnswerIndex;// Quel layout permet d'organiser les éléments horizontalement ou verticalement ? // FrameLayout, RelativeLayout, LinearLayout, ConstraintLayout, 2
public Question(String question, List<String> choiceList, int answerIndex) {
this.setQuestion(question);
this.setChoiceList(choiceList);
this.setAnswerIndex(answerIndex);
}<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setQuestion</span><span class="token punctuation">(</span>String question<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>mQuestion <span class="token operator">=</span> question<span class="token punctuation">;</span>
}
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setChoiceList</span><span class="token punctuation">(</span>List<span class="token operator"><</span>String<span class="token operator">></span> choiceList<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>choiceList <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">IllegalArgumentException</span><span class="token punctuation">(</span><span class="token string">"La liste ne peut pas être vide !"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
<span class="token keyword">this</span><span class="token punctuation">.</span>mChoiceList <span class="token operator">=</span> choiceList<span class="token punctuation">;</span>
}
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setAnswerIndex</span><span class="token punctuation">(</span><span class="token keyword">int</span> answerIndex<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>answerIndex <span class="token operator"><</span> <span class="token number">0</span> <span class="token operator">||</span> answerIndex <span class="token operator">>=</span> mChoiceList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">IllegalArgumentException</span><span class="token punctuation">(</span><span class="token string">"Mauvaise valeur d'index"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
<span class="token keyword">this</span><span class="token punctuation">.</span>mAnswerIndex <span class="token operator">=</span> answerIndex<span class="token punctuation">;</span>
}
<span class="token keyword">public</span> String <span class="token function">getQuestion</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> mQuestion<span class="token punctuation">;</span>
}
<span class="token keyword">public</span> List<span class="token operator"><</span>String<span class="token operator">></span> <span class="token function">getChoiceList</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> mChoiceList<span class="token punctuation">;</span>
}
<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getAnswerIndex</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> mAnswerIndex<span class="token punctuation">;</span>
}
<span class="token annotation punctuation">@Override</span>
public String toString() {
return "Question{" +
"mQuestion='" + mQuestion + ''' +
", mChoiceList=" + mChoiceList +
", mAnswerIndex=" + mAnswerIndex +
'}';
}
}
package ch.ceff.android.monquiz.model;
import java.util.Collections;
import java.util.List;public class QuestionBank {
<span class="token keyword">private</span> List<span class="token operator"><</span>Question<span class="token operator">></span> mQuestionList<span class="token punctuation">;</span>
private int mNextQuestionIndex;
public QuestionBank(List<Question> questionList) {
mQuestionList = questionList;
/// Mélanger la liste Collections.shuffle(mQuestionList);
mNextQuestionIndex = 0;
}<span class="token keyword">public</span> Question <span class="token function">getQuestion</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">/// Retoure à 0 si débordement de la liste </span>
if (mNextQuestionIndex == mQuestionList.size()) {
mNextQuestionIndex = 0;
}<span class="token keyword">return</span> mQuestionList<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>mNextQuestionIndex<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
}
- SharedPreferences
-
- Création
- mPreferences = getPreferences(MODE_PRIVATE);
-
- Ajout de donnée
-
- Récupération de l’éditeur
-
- Création de la donnée à stocker
-
- Stockage
- SharedPreferences.Editor editor = mPreferences.edit(); /// 1)
- editor.putString(“NOM”, “VALEUR”); /// 2)
- editor.apply(); /// 3)
- Lecture
- mPreferences.getString(“NOM”, null);
- Front-End
- Developpeur UX (Science)
- Developpeur UI (view)
- Developpeur app (controller, model)
- Back-End
- Developpeur BD, Réseau
Written with StackEdit.