הוספת מפה

בחירת פלטפורמה: 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, ולכן הן מספקות למפה את ניהול מחזור החיים ואת יכולות ממשק המשתמש של המחלקות הבסיסיות של 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. רישום הקריאה החוזרת.

  7. מקבלים נקודת אחיזה לאובייקט GoogleMap.

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

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

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

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

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

      

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

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

      

קבלת כינוי למקטע ורישום הקריאה החוזרת (callback)

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

  2. קוראים ל-method 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

משתמשים בשיטת הקריאה החוזרת 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.

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

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

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


מה עושים אחר כך

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