הרכיב 'פרטי המקום'

הרכיב 'פרטי מקום' בערכת ממשק המשתמש של Places מאפשר לכם להוסיף רכיב UI נפרד שמוצגים בו פרטי המקום באפליקציה.

רכיב קומפקטי של פרטי המקום

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

אפשר להשתמש ברכיב 'פרטי המקום' בנפרד או בשילוב עם שירותים וממשקי API אחרים של הפלטפורמה של מפות Google. הרכיב מקבל מזהה מקום או קואורדינטות של קו רוחב/אורך ומחזיר מידע מעוצב של פרטי המקום.

חיוב

כשמשתמשים ב-Place Details UI Kit, אתם מחויבים בכל פעם שמתבצעת קריאה ל-method‏ .loadWithPlaceId() או ל-method‏ .loadWithResourceName(). אם תטעינו את אותו מקום כמה פעמים, תחויבו על כל בקשה.

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

הוספת פרטי מקום לאפליקציה

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

יש שתי שיטות זמינות ב-Kotlin וב-Java: אחת לטעינה של החלק עם מזהה מקום (loadWithPlaceId()) ואחת לטעינה של החלק עם שם משאב (loadWithResourceName()). אפשר לבחור באחת מהשיטות, או בשתיהן אם משתמשים גם במזהי מקומות וגם בשמות משאבים.

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

Kotlin

val fragment = PlaceDetailsCompactFragment.newInstance(
  orientation,
  listOf(Content.ADDRESS, Content.TYPE, Content.RATING, Content.ACCESSIBLE_ENTRANCE_ICON),
  R.style.CustomizedPlaceDetailsTheme
)
      
fragment.setPlaceLoadListener(object : PlaceLoadListener {
  override fun onSuccess(place: Place) { ... }
      
  override fun onFailure(e: Exception) { ... }
})
      
supportFragmentManager
  .beginTransaction()
  .add(R.id.fragment_container, fragment)
  .commitNow()
      
// Load the fragment with a Place ID.
fragment.loadWithPlaceId(placeId)
// Load the fragment with a resource name.
//fragment.loadWithResourceName(resourceName)

Java

      
PlaceDetailsCompactFragment fragment =
  PlaceDetailsCompactFragment.newInstance(
        Orientation.HORIZONTAL,
        Arrays.asList(Content.ADDRESS, Content.TYPE, Content.RATING, Content.ACCESSIBLE_ENTRANCE_ICON),
        R.style.CustomizedPlaceDetailsTheme);
    
fragment.setPlaceLoadListener(
  new PlaceLoadListener() {
        @Override public void onSuccess(Place place) { ... }
    
        @Override public void onFailure(Exception e) { ... }
});
    
getSupportFragmentManager()
      .beginTransaction()
      .add(R.id.fragment_container, fragment)
      .commitNow();
    
// Load the fragment with a Place ID.
fragment.loadWithPlaceId(placeId);
      
// Load the fragment with a resource name.
// fragment.loadWithResourceName(resourceName);

הצגת הקוד המלא לטעינה של הווידג'ט 'פרטי מקום'

Kotlin

        import android.os.Bundle
        import android.util.Log
        import android.view.View
        import android.widget.FrameLayout
        import androidx.appcompat.app.AppCompatActivity
        import com.google.android.gms.maps.CameraUpdateFactory
        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.PointOfInterest
        import com.google.android.libraries.places.api.Places
        import com.google.android.libraries.places.api.net.PlacesClient
        import com.google.android.libraries.places.widget.PlaceDetailsCompactFragment
        import com.google.android.libraries.places.widget.PlaceDetailsCompactFragment.Companion.ALL_CONTENT
        import com.google.android.libraries.places.widget.model.Orientation
        
        class MainActivity : AppCompatActivity(), OnMapReadyCallback, GoogleMap.OnPoiClickListener {
            private var googleMap: GoogleMap? = null
            private val orientation: Orientation = Orientation.HORIZONTAL
            private lateinit var placesClient: PlacesClient
            private var placeDetailsFragment: PlaceDetailsCompactFragment? = null
        
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
        
                // --- Initialize Places SDK ---
                val apiKey = BuildConfig.PLACES_API_KEY
                if (apiKey.isEmpty()) {
                    Log.e("Places test", "No api key")
                    finish()
                    return
                }
                Places.initializeWithNewPlacesApiEnabled(applicationContext, apiKey)
                placesClient = Places.createClient(this)
                // -----------------------------
        
                val mapFragment = supportFragmentManager.findFragmentById(R.id.map_fragment) as SupportMapFragment?
                mapFragment?.getMapAsync(this)
            }
        
            override fun onMapReady(map: GoogleMap) {
                googleMap = map
                val sydney = LatLng(-33.8688, 151.2093)
                val zoomLevel = 13f
                googleMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, zoomLevel))
                googleMap?.setOnPoiClickListener(this)
            }
        
            override fun onPoiClick(poi: PointOfInterest) {
                val placeId = poi.placeId
                Log.d("POI Click", "Place ID: $placeId")
                showPlaceDetailsFragment(placeId)
            }
        
            private fun showPlaceDetailsFragment(placeId: String) {
                placeDetailsFragment = PlaceDetailsCompactFragment.newInstance(
                    ALL_CONTENT,
                    orientation,
                    R.style.CustomizedPlaceDetailsTheme
                )
                supportFragmentManager
                    .beginTransaction()
                    .replace(findViewById<FrameLayout>(R.id.place_details_fragment_host).id, placeDetailsFragment!!)
                    .commitNow()
                placeDetailsFragment?.loadWithPlaceId(placeId)
            }
        }               
        
        

התאמה אישית של פרטי המקום

ערכת ממשק המשתמש של מפות Google מציעה גישה למערכת עיצוב של התאמה אישית חזותית שמבוססת בערך על Material Design (עם כמה שינויים ספציפיים למפות Google). אפשר לעיין במאמרים בנושא צבע וטיפוגרפיה במסמכי העזרה של Material Design. כברירת מחדל, הסגנון תואם לשפת העיצוב החזותי של מפות Google.

אפשרויות להתאמה אישית של פרטי המקום

כשיוצרים מופע של קטע קוד, אפשר לציין עיצוב שיבטל את כל מאפייני הסגנון שמוגדרים כברירת מחדל. מאפייני עיצוב שלא בוטלו יתבססו על סגנונות ברירת המחדל. אם רוצים לתמוך בעיצוב כהה, אפשר להוסיף רשומה של הצבע בקובץ values-night/colors.xml.

  <style name="CustomizedPlaceDetailsTheme" parent="PlacesMaterialsTheme">
    <item name="placesColorPrimary">@color/app_primary_color</item>
    <item name="placesColorOnSurface">@color/app_color_on_surface</item>
    <item name="placesColorOnSurfaceVariant">@color/app_color_on_surface</item>
  
    <item name="placesTextAppearanceBodySmall">@style/app_text_appearence_small</item>
  
    <item name="placesCornerRadius">20dp</item>
  </style>

אפשר להתאים אישית את הסגנונות הבאים:

מאפיין העיצוב שימוש
צבע
placesColorSurface רקע של המכל ושל תיבת הדו-שיח
placesColorOnSurface כותרות, תוכן של תיבת דו-שיח
placesColorOnSurfaceVariant מידע על מקום
placesColorPrimary קישורים
placesColorOutlineDecorative גבול הקונטיינר
placesColorSecondaryContainer רקע כפתור
placesColorOnSecondaryContainer טקסט וסמל של כפתור
placesColorPositive הצבת התווית 'פתיחה'
placesColorNegative התווית 'סגור' מוצגת עכשיו במקום
placesColorInfo סמל הכניסה הנגישה
   
טיפוגרפיה
placesTextAppearanceHeadlineMedium כותרות של תיבות דו-שיח
placesTextAppearanceTitleSmall שם המקום
placesTextAppearanceBodyMedium התוכן של תיבת הדו-שיח
placesTextAppearanceBodySmall מידע על מקום
placesTextAppearanceLabelLarge תווית הכפתור
   
פינות
placesCornerRadius פינות של קונטיינרים
   
שיוך מותגים במפות Google
placesColorAttributionLight לחצן שיוך וחשיפת מידע של מפות Google בעיצוב בהיר (רשימות של ערכים קבועים לבן, אפור ושחור)
placesColorAttributionDark כפתור שיוך וחשיפת מידע במפות Google בעיצוב כהה (רשימות של ערכים קבועים לבן, אפור ושחור)

רוחב וגובה

בתצוגה אנכית, הרוחב המומלץ הוא בין 180dp ל-300dp. בתצוגות אופקיות, הרוחב המומלץ הוא בין 180dp ל-500dp. יכול להיות שהתצוגה בגודל קטן מ-160dp לא תוצג בצורה תקינה.

השיטה המומלצת היא לא להגדיר גובה. כך התוכן בחלון יוכל להגדיר את הגובה, וכך כל המידע יוצג.

צבעים של שיוך (Attribution)

התנאים וההגבלות של מפות Google מחייבים להשתמש באחד משלושת צבעי המותג לצורך שיוך למפות Google. השיוך הזה צריך להיות גלוי ונגיש אחרי ביצוע השינויים בהתאמה האישית.

יש לנו 3 צבעי מותג לבחירה, שאפשר להגדיר בנפרד לעיצוב בהיר ולעיצוב כהה:

  • עיצוב בהיר: placesColorAttributionLight עם ערכים מוגדרים מראש (enums) לבן, אפור ושחור.
  • עיצוב כהה: placesColorAttributionDark עם ערכים מוגדרים מראש (enums) לבן, אפור ושחור.

דוגמאות להתאמה אישית

בדוגמה הזו מתבצעת התאמה אישית של התוכן הרגיל.

  val fragmentStandardContent = PlaceDetailsCompactFragment.newInstance(
    orientation,
    PlaceDetailsCompactFragment.STANDARD_CONTENT,
    R.style.CustomizedPlaceDetailsTheme
  )

בדוגמה הזו מתבצעת התאמה אישית של אפשרויות התוכן.

  val placeDetailsFragment = PlaceDetailsCompactFragment.newInstance(
    orientation,
    listOf(
        Content.ADDRESS,
        Content.ACCESSIBLE_ENTRANCE,Content.MEDIA
    ),
    R.style.CustomizedPlaceDetailsTheme
)
  

בדוגמה הזו מתבצעת התאמה אישית של כל האפשרויות של Content.

  val fragmentAllContent = PlaceDetailsCompactFragment.newInstance(
    orientation,
    PlaceDetailsCompactFragment.ALL_CONTENT,
    R.style.CustomizedPlaceDetailsTheme
  )