Un projet Android est principalement composé de 2 types de fichiers :
- les ressources ;
- les classes Java (UNE classe dans UN fichier).
Elle sont dans le dossier "\res" et permettent de transférer de l'information à votre application. En particulier :
- les constantes (dossier "\res\values") que ce soient des chaînes de caractères, des couleurs, etc ;
- les vues (dossier "\res\layout") ;
- les images (dossier "\res\drawable").
C'est le cœur de votre application, il y en a deux types à distinguer :
- les activités : ce sont des classes spécialisées qui permettent de faire le lien avec les vues ;
- les autres : toute classe Java permettant de traiter et de gérer la donnée.
Elles sont déclarées dans le fichier "\res\values\string.xml" :
<resources>
<string name="app_name" translatable="false">Résumé</string>
<string name="welcome">Bienvenue !</string>
<string name="ask_day">Quel jour sommes-nous ?</string>
<string name="today">Nous somme le %d du mois...</string>
</resources>On peut y accéder depuis :
- une autre ressource :
@string/welcome; - une classe java :
getString(R.string.welcome);
Elles sont déclarées dans le dossier "\res\layout" : il y a un fichier par vues.
Conseil :
- pensez à bien nommer vos composants pour y accéder plus facilement ensuite ;
- les
LinearLayoutsont un bon moyen de positionner simplement vos composants : ils juxtaposent les composants (verticalementandroid:orientation="vertical"ou horizontalementandroid:orientation="horizontal").
Exemple :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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="fr.ign.sasyan.resume.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/welcome"
android:layout_gravity="center" />
<Button
android:id="@+id/ask_day"
android:text="@string/ask_day"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
<TextView
android:id="@+id/show_day"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>
</RelativeLayout>Ce sont des classes Java comme les autres. Elles permettent à l'utilisateur d’interagir avec le programme. Pour cela, vous devrez instancier les composants en objets Java.
Je vous conseil de toujours utiliser cette structure :
public class MainActivity extends AppCompatActivity {
/**
* Déclaration des objets Java représentant les composants graphiques
* (en attributs de la classe, ils sont donc accessibles depuis toutes les méthodes)
*/
Button askDay;
TextView showDay;
/**
* Fonction exécutée à la création de la vue
* Elle DOIT instancier les objets Java représentant les composants
* graphiques ET leur ajouter des écouteurs d'événements si besoin.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadComponent();
initEventListeners();
}
/**
* Instanciation les objets Java représentant les composants graphiques
*/
private void loadComponent() {
askDay = (Button)findViewById(R.id.ask_day);
showDay = (TextView)findViewById(R.id.show_day);
}
/**
* Ajout des écouteurs d'évènements aux composants graphiques représentés par des objets Java
*/
private void initEventListeners() {
askDay.setOnClickListener(askDayClickListener);
}
/**
* Ceci est un écouteur d'évènement "onClick" qui sera associé à l'objet
* Button askDay représentant le composant Button "ask_day"
* (C'est aussi un attribut de la classe...)
*/
View.OnClickListener askDayClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
// Récupération de la réponse brute (depuis les ressources)
String réponse_brute = getString(R.string.today);
// Récupération de la date (déclaration et instanciation d'un objet Date)
Date date = new Date();
// Génération de la réponse :
String réponse = String.format(réponse_brute, date.getDate());
// Affichage de la réponse via en utilisant un composant graphique TextView :
showDay.setText(réponse);
}
};
}Gradle est l'outil qui, dans Android Studio, gère les dépendances et les ressources de votre programme. S'il y a un problème dans Gradle, c'est que vos ressources ne sont pas valides ou qu'une dépendance est mal gérée.
Dans ces cas là, vous verrez en général le R de la classe ressource en rouge :
Une variable affichée en rouge dans Android Studio est une variable non déclarée :
Pensez dans ce cas à vérifier la portée de la variable qui dépend de l'endroit où elle est déclarée (déclarée en attribut elle sera accessible dans toute la classe, déclarée dans un méthode, elle ne sera accessible que dans cette méthode).
Si le programme plante à l'instanciation d'une variable, c'est que vous essayez surement d'accéder à un élément qui n'existe par encore.
Souvenez-vous :
- les composants existent (et sont instanciables) après l'exécution de la méthode
void setContentView(int resId);dans la méthodeonCreatedes classe d'activité :
// Ne pas écrire :
askDay = (Button)findViewById(R.id.ask_day);
setContentView(R.layout.activity_main);
// Mais :
setContentView(R.layout.activity_main);
askDay = (Button)findViewById(R.id.ask_day);- les composants sont utilisables après leur instanciation :
// Ne pas écrire :
askDay.setOnClickListener(askDayClickListener);
askDay = (Button)findViewById(R.id.ask_day);
// Mais :
askDay = (Button)findViewById(R.id.ask_day);
askDay.setOnClickListener(askDayClickListener);Les problèmes peuvent venir d'autres endroits, pensez par exemple à vérifier le fichier AndroidManifest (si ce fichier est incorrect, Gradle ne devrait pas fonctionner).


