Bâtir Une Application De Visionneuse De Tremblement De Terre
Vous allez commencer à créer une application qui utilisera une source de données sur les tremblements de terre provenant du United States Geological Survey (USGS) pour afficher une liste (et éventuellement une carte) des tremblements de terre récents. Nous allons commencer par créer l'interface utilisateur d'activité pour cette application à l'aide d'activités, de présentations et de fragments.
Remarque
Pour simplifier la lisibilité, chacun de ces exemples exclut les instructions d'importation. Si vous utilisez Android Studio, vous pouvez activer «ajouter automatiquement à la volée des importations non ambiguës» dans la boîte de dialogue Paramètres sous Éditeur ➪ Général Importation automatique, comme illustré à la figure 3-6, pour renseigner les instructions d'importation requises pour prendre en charge les classes utilisées. dans votre code que vous tapez. Vous pouvez également appuyer sur Alt + Entrée sur chaque nom de classe non résolu, si nécessaire.
1. Commencez par créer un nouveau projet Tremblement de terre. Il doit prendre en charge les téléphones et les tablettes, avec un SDK minimal d'API 16. Lorsque vous y êtes invité, attribuez un nom à l'activité principale EarthquakeMainActivity à l'aide du modèle d'activité vide. Il doit également utiliser la bibliothèque de compatibilité des applications, qui est activée en cochant la case Compatibilité avec les versions antérieures (AppCompat).
2. Créez un nouveau cours public sur les séismes. Cette classe sera utilisée pour stocker les détails (id, date, détails, emplacement, magnitude et lien) de chaque séisme. Remplacez la méthode toString pour fournir la chaîne qui sera utilisée pour représenter chaque séisme dans la liste des séismes:
import java.util.Date; import java.text.SimpleDateFormat; import java.util.Locale; import android.location.Location;
public class Earthquake { private String mId; private Date mDate; private String mDetails; private Location mLocation; private double mMagnitude; private String mLink;
public String getId() { return mId; } public Date getDate() { return mDate; } public String getDetails() { return mDetails; } public Location getLocation() { return mLocation; } public double getMagnitude() { return mMagnitude; } public String getLink() { return mLink; }
public Earthquake(String id, Date date, String details,
Location location,
double magnitude, String link) {
mId = id; mDate = date; mDetails = details; mLocation = location; mMagnitude = magnitude;
mLink = link; }
@Override
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("HH.mm", Locale.US);
String dateString = sdf.format(mDate);
return dateString + ": " + mMagnitude + " " + mDetails; }
@Override
public boolean equals(Object obj) { if (obj instanceof Earthquake)
return (((Earthquake)obj).getId().contentEquals(mId));
else
return false;
}
}
3. Créez un nouveau fichier de ressource XML dimens.xml dans le dossier res / values pour stocker les valeurs de ressource de dimension. Créez de nouvelles dimensions pour les marges de l'écran en fonction du 16dp recommandé par les directives de conception d'Android.
< ?xml version="1.0" encoding="utf-8"? >
< resources >
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="text_margin">16dp</dimen>
< /resources >
4. Créez maintenant une nouvelle ressource de présentation list_item_earthquake.xml dans le dossier res / layout. Ceci sera utilisé pour afficher chaque séisme dans la liste. Pour le moment, utilisez une simple TextView qui affiche une seule ligne de texte en utilisant la marge de l’étape 3 et l’apparence du texte de l’élément de liste du cadre Android. Nous y reviendrons au chapitre 5 pour créer une mise en page plus riche et plus complexe:
< ?xml version="1.0" encoding="utf-8"? >
< FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:id="@+id/list_item_earthquake_details"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin"
android:textAppearance="?attr/textAppearanceListItem"/> < /FrameLayout >
5. Créez une nouvelle classe EarthquakeListFragment qui étend Fragment et stocke un tableau de tremblements de terre:
public class EarthquakeListFragment extends Fragment {
private ArrayList<Earthquake> mEarthquakes = new ArrayList<Earthquake>();
public EarthquakeListFragment() { }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
6. Notre liste de tremblements de terre sera affichée à l'aide de RecyclerView dans le fragment créé à l'étape 5. Une vue de recycleur est un composant visuel qui affiche une liste déroulante d'éléments. Nous explorons plus précisément la vue Recycler au chapitre 5. Pour commencer, ajoutez une dépendance à la bibliothèque Recycler View dans le fichier build.gradle du module d'application:
dependencies {
[... Existing dependencies ...] implementation 'com.android.support:recyclerview-v7:27.1.1' }
7. Créez maintenant un nouveau fichier de présentation fragment_earthquake_list.xml dans le dossier res / layout, qui définit la présentation de la classe Fragment créée à l'étape 5; il devrait inclure un seul élément RecyclerView:
< ?xml version="1.0" encoding="utf-8"? >
< android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" app:layoutManager="LinearLayoutManager" />
8. Revenez à la classe de fragments de liste de tremblements de terre et substituez la méthode onCreateView pour gonfler la mise en page à partir de l'étape 7:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_earthquake_list,
container, false);
return view; }
9. Modifiez le fichier activity_earthquake_main.xml en remplaçant la présentation par défaut par un FrameLayout qui servira de conteneur pour le fragment créé à l'étape 5. Assurez-vous de lui attribuer un ID afin de pouvoir le référencer à partir du code d'activité:
< ?xml version="1.0" encoding="utf-8"? >
< FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main_activity_frame"> < /FrameLayout >
10. Revenez à l'activité principale de tremblement de terre et mettez à jour la méthode onCreate afin d'utiliser le gestionnaire de fragments pour ajouter le fragment de liste de tremblements de terre de l'étape 5 à la présentation de trame définie à l'étape 9. Notez que si votre activité est recréée pour les raisons suivantes: Lorsqu’une modification de la configuration de l’appareil a été effectuée, tous les fragments ajoutés à l’aide du gestionnaire de fragments seront automatiquement ajoutés. En conséquence, nous n’ajoutons un nouveau fragment que s’il ne s’agit pas d’un redémarrage avec changement de configuration; sinon, on peut le trouver en utilisant sa balise:
private static final String TAG_LIST_FRAGMENT = "TAG_LIST_FRAGMENT"; EarthquakeListFragment mEarthquakeListFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_earthquake_main); FragmentManager fm = getSupportFragmentManager();
// Android will automatically re-add any Fragments that
// have previously been added after a configuration change,
// so only add it if this isn't an automatic restart. if (savedInstanceState == null) { FragmentTransaction ft = fm.beginTransaction();
mEarthquakeListFragment = new EarthquakeListFragment();
ft.add(R.id.main_activity_frame, mEarthquakeListFragment, TAG_LIST_FRAGMENT);
ft.commitNow();
} else {
mEarthquakeListFragment =
(EarthquakeListFragment)fm.findFragmentByTag(TAG_LIST_FRAGMENT);
}
}
11. Créez maintenant une nouvelle classe EarthquakeRecyclerViewAdapter qui étend RecyclerView .Adapter et créez une nouvelle classe ViewHolder qui étend RecyclerView .ViewHolder. Le détenteur de vue sera utilisé pour conserver une référence à chaque vue de la définition de disposition d'élément tremblement de terre à l'étape 4, lorsque vous lui lierez les valeurs de tremblement de terre dans la méthode onBindViewHolder de l'adaptateur de vue de recycleur de tremblement de terre. Le rôle de l’adaptateur de vue pour recycleur de tremblement de terre est de fournir des mises en page de vues remplies en fonction de la liste des tremblements de terre qu’il entretient. Nous examinerons la vue Recycler et son adaptateur plus en détail au chapitre 5.
public class EarthquakeRecyclerViewAdapter extends RecyclerView.Adapter<EarthquakeRecyclerViewAdapter.ViewHolder> { private final List<Earthquake> mEarthquakes;
public EarthquakeRecyclerViewAdapter(List<Earthquake> earthquakes ) {
mEarthquakes = earthquakes; }
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item_earthquake,
parent, false); return new ViewHolder(view); }
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.earthquake = mEarthquakes.get(position);
holder.detailsView.setText(mEarthquakes.get(position).toString()); }
@Override
public int getItemCount() { return mEarthquakes.size(); }
public class ViewHolder extends RecyclerView.ViewHolder {
public final View parentView; public final TextView detailsView; public Earthquake earthquake;
public ViewHolder(View view) {
super(view); parentView = view; detailsView = (TextView)
view.findViewById(R.id.list_item_earthquake_details); }
@Override
public String toString() {
return super.toString() + " '" + detailsView.getText() + "'";
}
}
}
12. Revenez au fragment de la liste des tremblements de terre et mettez à jour onCreateView pour obtenir une référence à la vue Recycler et substituez la méthode onViewCreated pour affecter le EarthquakeRecyclerViewAdapter de l'étape 11 à la vue Recycler:
private RecyclerView mRecyclerView;
private EarthquakeRecyclerViewAdapter mEarthquakeAdapter = new EarthquakeRecyclerViewAdapter(mEarthquakes);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_earthquake_list, container, false); mRecyclerView = (RecyclerView) view.findViewById(R.id.list);
return view; }
@Override
public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState);
// Set the Recycler View adapter
Context context = view.getContext();
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
mRecyclerView.setAdapter(mEarthquakeAdapter); }
13. Toujours dans le fragment de liste de tremblement de terre, ajoutez une méthode setEarthquakes qui prend une liste de tremblements de terre, recherche les doublons, puis ajoute chaque nouveau séisme à la liste de matrices. Il doit également informer l'adaptateur de recycleur qu'un nouvel élément a été inséré:
public void setEarthquakes(List<Earthquake> earthquakes) {
for (Earthquake earthquake: earthquakes) { if (!mEarthquakes.contains(earthquake)) {
mEarthquakes.add(earthquake);
mEarthquakeAdapter
.notifyItemInserted(mEarthquakes.indexOf(earthquake));
}
}
}
14. Au chapitre 7, vous apprendrez à télécharger et à analyser le flux USGS relatif aux tremblements de terre, mais pour vérifier que votre application fonctionne, mettez à jour votre méthode onCreate de l'activité principale de tremblement de terre afin de créer des tremblements de terre factices, afin de garantir leur importation. les bibliothèques java.util.Date et java.util.Calendar pour les fonctions de date / heure. Une fois créé, transmettez le nouveau séisme à votre fragment de liste de séismes en utilisant sa méthode setEarthquakes:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_earthquake_main);
FragmentManager fm = getSupportFragmentManager();
if (savedInstanceState == null) {
FragmentTransaction ft = fm.beginTransaction(); mEarthquakeListFragment = new EarthquakeListFragment(); ft.add(R.id.main_activity_frame, mEarthquakeListFragment,
TAG_LIST_FRAGMENT);
ft.commitNow();
} else {
mEarthquakeListFragment =
(EarthquakeListFragment)fm.findFragmentByTag(TAG_LIST_FRAGMENT);
}
Date now = Calendar.getInstance().getTime();
List<Earthquake> dummyQuakes = new ArrayList<Earthquake>(0); dummyQuakes.add(new Earthquake("0", now, "San Jose", null, 7.3, null)); dummyQuakes.add(new Earthquake("1", now, "LA", null, 6.5, null));
mEarthquakeListFragment.setEarthquakes(dummyQuakes); }
15. Lorsque vous exécutez votre projet, vous devriez voir une vue Recycler comportant les deux tremblements de terre factices.