הוספת מפה

בחירת פלטפורמה: 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 ולהוסיף את המסגרות הנדרשות, עליכם לפעול לפי השלבים הבאים:

    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. מוסיפים את המאפיין android:id לרכיב fragment ומגדירים אותו בשדה מזהה המשאב (@+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. מבצעים עסקה שמוסיפה את הקטע לפעילות. למידע נוסף קראו את המאמר פירוט עסקאות.

לדוגמה:

Java


SupportMapFragment mapFragment = SupportMapFragment.newInstance();
getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.my_container, mapFragment)
    .commit();

      

Kotlin


val mapFragment = SupportMapFragment.newInstance()
supportFragmentManager
    .beginTransaction()
    .add(R.id.my_container, mapFragment)
    .commit()

      

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

מעדכנים את הצהרת הפעילות באופן הבא:

Java


class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
    // ...
}

      

Kotlin


class MainActivity : AppCompatActivity(), OnMapReadyCallback {

    // ...
}

      

הגדרה של תצוגת התוכן

בשיטה onCreate של הפעילות, צריך לקרוא ל-method setContentView ולהגדיר את קובץ הפריסה בתור תצוגת התוכן.

לדוגמה, אם שם קובץ הפריסה הוא main.xml:

Java


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

      

Kotlin


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)
}

      

קבלת כינוי למקטע ורישום ה-callback

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

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

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

Java


SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

      

Kotlin


val mapFragment = supportFragmentManager
    .findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)

      

קבלת כינוי לאובייקט GoogleMap

משתמשים בשיטת הקריאה החוזרת (callback) onMapReady כדי לקבל כינוי GoogleMap לאובייקט. הקריאה החוזרת מופעלת כשהמפה מוכנה לקבל קלט של משתמשים. הוא מספק מופע שאינו אפס של המחלקה GoogleMap, שאפשר להשתמש בו כדי לעדכן את המפה.

בדוגמה הזו, ה-callback של onMapReady מאחזר כינוי לאובייקט GoogleMap ולאחר מכן נוסף סמן למפה:

Java


@Override
public void onMapReady(GoogleMap googleMap) {
    googleMap.addMarker(new MarkerOptions()
        .position(new LatLng(0, 0))
        .title("Marker"));
}

      

Kotlin


override fun onMapReady(googleMap: GoogleMap) {
    googleMap.addMarker(
        MarkerOptions()
            .position(LatLng(0.0, 0.0))
            .title("Marker")
    )
}

      

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

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

מציגים את הקוד כדי לראות את כל הפעילות:

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


מה השלב הבא?

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