הוספת מפה

בחירת פלטפורמה: Android iOS JavaScript

כאן מוסבר איך להוסיף מפה בסיסית לאפליקציה ל-Android אחרי שהגדרתם את הפרויקט לשימוש ב-SDK של מפות Google ל-Android. אחרי שמוסיפים מפה, אפשר לשנות את הסוג והתכונות של המפה.

סקירה כללית

ב-SDK של מפות Google ל-Android יש כמה סיווגים שבהם האפליקציה יכולה להשתמש כדי לנהל את מחזור החיים, הפונקציונליות והנתונים של המפה. המחלקות תומכות באינטראקציות של משתמשים שמבוססות על מודל ממשק המשתמש של Android, כמו הגדרת המצב הראשוני של המפה ותגובה לקלט תנועות מהמשתמש בזמן הריצה.

הממשק הראשי והמחלקות לטיפול במפות:

  • GoogleMap — נקודת הכניסה לניהול המאפיינים והנתונים הבסיסיים של המפה. האפליקציה יכולה לגשת לאובייקט GoogleMap רק אחרי שאוחזר מאובייקט SupportMapFragment או MapView.

  • SupportMapFragmentקטע לניהול מחזור החיים של אובייקט GoogleMap.

  • MapViewתצוגה לניהול מחזור החיים של אובייקט 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.

השלבים הבסיסיים:

  1. כדי לקבל את ה-SDK, לקבל מפתח API ולהוסיף את ה-frameworks הנדרשים, עליכם לבצע את השלבים הבאים:

    1. הגדרה במסוף Google Cloud

    2. שימוש במפתח API

    3. הגדרה של פרויקט Android Studio

  2. יש להוסיף אובייקט SupportMapFragment לפעילות שתטפל במפה. אפשר להוסיף את המקטע באופן סטטי או דינמי.

  3. הטמעת הממשק של OnMapReadyCallback.

  4. מגדירים את קובץ הפריסה בתור תצוגת התוכן.

  5. אם הוספתם את המקטע באופן סטטי, צריך לקבל מזהה למקטע.

  6. רושמים את הקריאה החוזרת (callback).

  7. צריך לקבל נקודת אחיזה לאובייקט GoogleMap.

הוספת אובייקט SupportMapFragment

אפשר להוסיף אובייקט SupportMapFragment לאפליקציה באופן סטטי או דינמי. הדרך הפשוטה ביותר היא להוסיף אותו באופן סטטי. כשמוסיפים את המקטע באופן דינמי, אפשר לבצע פעולות נוספות בקטע, כמו הסרה והחלפה שלו בזמן ריצה.

כדי להוסיף מקטע באופן סטטי

בקובץ הפריסה של הפעילות שתטפל במפה:

  1. הוספת רכיב fragment.
  2. מוסיפים את הצהרת השם xmlns:map="http://schemas.android.com/apk/res-auto". כך אפשר להשתמש ב-maps מאפייני XML מותאמים אישית.
  3. ברכיב fragment מגדירים את המאפיין android:name כ-com.google.android.gms.maps.SupportMapFragment.
  4. ברכיב 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"/>

כדי להוסיף מקטע באופן דינמי

בפעילות:

  1. יוצרים מכונה של SupportMapFragment.
  2. צריך לבצע עסקה שמוסיפה את המקטע לפעילות. למידע נוסף קראו את המאמר Fragment Transactions.

לדוגמה:

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);
}

      

צריך למצוא מזהה למקטע ולרשום את הקריאה החוזרת (callback)

  1. כדי לזהות את המקטע, צריך לקרוא ל-method FragmentManager.findFragmentById ולהעביר לה את מזהה המשאב של המקטע בקובץ הפריסה. אם הוספתם את המקטע באופן דינמי, דלגו על השלב הזה מפני שכבר אחזרתם את הכינוי.

  2. כדי להגדיר את הקריאה החוזרת (callback) במקטע, צריך להפעיל את השיטה getMapAsync.

לדוגמה, אם הוספתם את המקטע באופן סטטי:

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

משתמשים בשיטת הקריאה החוזרת (callback) onMapReady כדי לקבל מזהה לאובייקט 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"));
}

      

צילום מסך שבו המפה והסמן ממורכזים באי נול.

אחרי שבונים ומפעילים את האפליקציה, מוצגת מפה עם סמן באי נול (קו רוחב של אפס מעלות וקו אורך של אפס מעלות).

לצפייה בקוד של כל הפעילות:

הצגת הפעילות הושלמה


המאמרים הבאים

לאחר השלמת השלבים האלה, תוכלו לקבוע את הגדרות המפה.