הוספת מפה

בחירת פלטפורמה: 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. צריך לבצע טרנזקציה שמוסיפה את המקטע לפעילות. למידע נוסף קראו את המאמר פירוט עסקאות.

למשל:

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

      

קבלת מזהה למקטע ורישום הקריאה החוזרת

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

  2. קוראים ל-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 כדי לטפל באובייקט 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"));
}

      

צילום מסך עם המפה והסמן ממורכזים ב-Null איילנד.

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

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

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


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

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