בנושא הזה נסביר איך להוסיף מפה בסיסית לאפליקציה ל-Android אחרי שמגדירים את הפרויקט לשימוש ב-SDK של מפות ל-Android. אחרי שמוסיפים מפה, אפשר לשנות את סוג המפה והתכונות שלה.
סקירה כללית
ב-SDK של מפות ל-Android יש כמה כיתות שבהן האפליקציה שלכם יכולה להשתמש כדי לנהל את מחזור החיים, הפונקציונליות והנתונים של המפה. המחלקות תומכות באינטראקציות של משתמשים על סמך מודל ממשק המשתמש של Android, כמו הגדרת המצב הראשוני של המפה ותגובה לקלט תנועות מהמשתמש בזמן ריצה.
הממשק והמחלקות הראשיים לטיפול במפות:
GoogleMap
– נקודת הכניסה לניהול המאפיינים והנתונים של המפה. האפליקציה יכולה לגשת לאובייקטGoogleMap
רק אחרי שהוא אוחזר מאובייקטSupportMapFragment
אוMapView
.SupportMapFragment
– קטע קוד לניהול מחזור החיים של אובייקטGoogleMap
.OnMapReadyCallback
– ממשק קריאה חוזרת שמטפל באירועים ובאינטראקציה של המשתמש עבור האובייקטGoogleMap
.
אובייקט GoogleMap
מבצע באופן אוטומטי את הפעולות הבאות:
- מתבצעת התחברות לשירות של מפות Google.
- הורדת אריחי המפה.
- הצגת משבצות במסך המכשיר.
- הצגת פקדים שונים, כמו הזזה וזום.
- תגובה לתנועות של תנועה פנורמית ושינוי מרחק התצוגה על ידי הזזת המפה והגדלה או הקטנה של התצוגה.
כדי להשתמש באובייקט GoogleMap
באפליקציה, צריך להשתמש באובייקט SupportMapFragment
או MapView
כאובייקט קונטיינר למפה, ואז לאחזר את האובייקט GoogleMap
מהקונטיינר. מאחר שסוגי המארזים מגיעים מחלק או מתצוגה של Android, הם מספקים למפה את יכולות הניהול של מחזור החיים ואת יכולות ממשק המשתמש של סוגי הבסיס שלהם ב-Android.
הכיתה SupportMapFragment
היא הקונטיינר המודרני והנפוץ יותר לאובייקט GoogleMap
.
הצגת הקוד
הקוד הבא הוא מהפעילות המלאה ב-Java שנעשה בה שימוש בנושא הזה כשמוסיפים קטע באופן סטטי. פרויקט Android נוצר מתבנית הפרויקט הריק, ולאחר מכן עודכן על סמך המדריך בנושא הגדרת הפרויקט. אחרי ביצוע השלבים שבנושא הזה, הקוד עשוי להיות שונה בהתאם לתבנית הפרויקט.
package com.example.mapsetup; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; // Implement OnMapReadyCallback. public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set the layout file as the content view. setContentView(R.layout.activity_main); // Get a handle to the fragment and register the callback. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } // Get a handle to the GoogleMap object and display marker. @Override public void onMapReady(GoogleMap googleMap) { googleMap.addMarker(new MarkerOptions() .position(new LatLng(0, 0)) .title("Marker")); } }
כדי להוסיף מפה
בקטע הזה מוסבר איך להוסיף מפה בסיסית באמצעות שימוש במקטעים כמאגרי מפה. עם זאת, אפשר להשתמש בתצוגה במקום זאת. דוגמה לכך מופיעה ב-RawMapViewDemoActivity ב-GitHub.
השלבים הבסיסיים:
כדי לקבל את ה-SDK, לקבל מפתח API ולהוסיף את המסגרות הנדרשות, פועלים לפי השלבים שמפורטים במאמרים הבאים:
מוסיפים אובייקט
SupportMapFragment
לפעילות שתטפל במפה. אפשר להוסיף את הקוד של הנכס באופן סטטי או דינמי.מטמיעים את הממשק
OnMapReadyCallback
.מגדירים את קובץ הפריסה בתור תצוגת התוכן.
אם הוספתם את המקטע באופן סטטי, תצטרכו ליצור נקודת אחיזה למקטע.
רושמים את הקריאה החוזרת.
מקבלים אחיזה (handle) לאובייקט
GoogleMap
.
הוספת אובייקט SupportMapFragment
אפשר להוסיף אובייקט SupportMapFragment
לאפליקציה באופן סטטי או דינמי.
הדרך הפשוטה ביותר היא להוסיף אותו באופן סטטי. אם מוסיפים את הקטע באופן דינמי, אפשר לבצע פעולות נוספות על הקטע, כמו הסרה וחילוף שלו במהלך זמן הריצה.
הוספת קטע באופן סטטי
בקובץ הפריסה של הפעילות שתטפל במפה:
- צריך להוסיף רכיב
fragment
. - מוסיפים את הצהרת השם
xmlns:map="http://schemas.android.com/apk/res-auto"
. כך אפשר להשתמש במאפייני XML מותאמים אישית שלmaps
. - ברכיב
fragment
, מגדירים את המאפייןandroid:name
ל-com.google.android.gms.maps.SupportMapFragment
. - ברכיב
fragment
, מוסיפים את המאפייןandroid:id
ומגדירים אותו ל-מזהה המשאב (@+id/map
) של R.id.map.
לדוגמה, הנה קובץ פריסה מלא שכולל רכיב fragment
:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
כדי להוסיף מקטע באופן דינמי
בפעילות:
- יוצרים מכונה של
SupportMapFragment
. - מבצעים טרנזקציה שמוסיפה את הנכס לפעילות. למידע נוסף, ראו פיצול עסקאות.
לדוגמה:
Kotlin
val mapFragment = SupportMapFragment.newInstance() supportFragmentManager .beginTransaction() .add(R.id.my_container, mapFragment) .commit()
Java
SupportMapFragment mapFragment = SupportMapFragment.newInstance(); getSupportFragmentManager() .beginTransaction() .add(R.id.my_container, mapFragment) .commit();
הטמעת הממשק OnMapReadyCallback
מעדכנים את הצהרת הפעילות באופן הבא:
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback { // ... }
Java
class MainActivity extends AppCompatActivity implements OnMapReadyCallback { // ... }
הגדרת תצוגת התוכן
ב-method onCreate
של הפעילות, קוראים ל-method setContentView
ומגדירים את קובץ הפריסה כתצוגת תוכן.
לדוגמה, אם השם של קובץ הפריסה הוא main.xml
:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) }
Java
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }
אחזור של ה-handle ל-fragment ורישום של פונקציית ה-callback
כדי לקבל אחיזה בחלקיק, צריך להפעיל את השיטה
FragmentManager.findFragmentById
ולהעביר לה את מזהה המשאב של החלקיק בקובץ הפריסה. אם הוספת את החלק באופן דינמי, אפשר לדלג על השלב הזה כי כבר אחזרתם את הכינוי.קוראים ל-method
getMapAsync
כדי להגדיר את הקריאה החוזרת ב-fragment.
לדוגמה, אם הוספתם את הקוד של ה-fragment באופן סטטי:
Kotlin
val mapFragment = supportFragmentManager .findFragmentById(R.id.map) as SupportMapFragment mapFragment.getMapAsync(this)
Java
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this);
אחזור של אחיזה באובייקט GoogleMap
משתמשים בשיטת הקריאה החוזרת onMapReady
כדי לקבל אחיזה (handle) לאובייקט GoogleMap
. הקריאה החוזרת מופעלת כשהמפה מוכנה לקבל קלט מהמשתמש. היא מספקת מופע לא null של המחלקה GoogleMap
, שבעזרתו אפשר לעדכן את המפה.
בדוגמה הזו, הקריאה החוזרת (callback) של onMapReady
מאחזרת נקודת אחיזה לאובייקט GoogleMap
, ולאחר מכן נוסף סמן למפה:
Kotlin
override fun onMapReady(googleMap: GoogleMap) { googleMap.addMarker( MarkerOptions() .position(LatLng(0.0, 0.0)) .title("Marker") ) }
Java
@Override public void onMapReady(GoogleMap googleMap) { googleMap.addMarker(new MarkerOptions() .position(new LatLng(0, 0)) .title("Marker")); }
אחרי שיוצרים ומפעילים את האפליקציה בהצלחה, היא תציג מפה עם סמן באי נול (קו רוחב של אפס מעלות וקו אורך של אפס מעלות).
הצגת הקוד של הפעילות המלאה:
המאמרים הבאים
אחרי שתבצעו את השלבים האלה, תוכלו להגדיר את הגדרות המפה.