במאמר זה נסביר איך להוסיף מפה בסיסית לאפליקציה ל-Android לאחר הגדרתם את הפרויקט לשימוש ב-SDK של מפות Google ל-Android. אחרי כשאתם מוסיפים מפה, תוכלו לשנות את הסוג והתכונות של המפה.
סקירה כללית
ה-SDK של מפות Google ל-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")); } }
כדי להוסיף מפה
בקטע הזה מתואר איך להוסיף מפה בסיסית באמצעות שימוש במקטע כמפה container; עם זאת, אפשר להשתמש בתצוגה במקום זאת. דוגמה לכך מופיעה ב-RawMapViewDemoActivity ב-GitHub.
השלבים הבסיסיים:
כדי לקבל את ה-SDK, אתם צריכים לקבל מפתח API ולהוסיף את ה-frameworks הנדרשות, פועלים לפי השלבים הבאים:
מוסיפים אובייקט
SupportMapFragment
לפעילות שתטפל במפה. אפשר להוסיף את המקטע באופן סטטי או דינמי.הטמעת הממשק של
OnMapReadyCallback
.מגדירים את קובץ הפריסה כתצוגת תוכן.
אם הוספתם את ה-fragment באופן סטטי, צריך לקבל אחיזה ב-fragment.
רישום הקריאה החוזרת.
מקבלים נקודת אחיזה לאובייקט
GoogleMap
.
הוספת אובייקט SupportMapFragment
אפשר להוסיף אובייקט SupportMapFragment
לאפליקציה באופן סטטי או דינמי.
הדרך הפשוטה ביותר היא להוסיף אותו באופן סטטי. אם תוסיפו את המקטע באופן דינמי,
אפשר לבצע פעולות נוספות על המקטע, כמו הסרה
שיחליף אותו בזמן הריצה.
כדי להוסיף מקטע באופן סטטי
בקובץ הפריסה של הפעילות שתטפל במפה:
- צריך להוסיף רכיב
fragment
. - הוספה של הצהרת השם
xmlns:map="http://schemas.android.com/apk/res-auto"
כך אפשר להשתמש שלmaps
מאפייני XML מותאמים אישית. - ברכיב
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 { // ... }
הגדרת תצוגת התוכן
בשיטת הפעילות onCreate
, מפעילים את הפונקציה
שיטה 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
כדי להגדיר את הקריאה החוזרת (callback) מקטע.
לדוגמה, אם הוספתם את המקטע באופן סטטי:
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
שבהם אפשר להשתמש כדי לעדכן את המפה.
בדוגמה הזו, פונקציית הקריאה החוזרת 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")); }
אחרי שתיצרו ותפעילו את האפליקציה, תוצג בה מפה עם סמן באי Null Island (אפס מעלות קו רוחב ואפס מעלות קו אורך).
הצגת הקוד של הפעילות המלאה:
המאמרים הבאים
אחרי שתבצעו את השלבים האלה, תוכלו לקבוע את הגדרות המפה.