Componente Place Details
O componente Place Details do Places UI Kit permite adicionar um componente de interface individual que mostra detalhes de lugares no seu app. Esse componente é personalizável.

O componente Detalhes do lugar pode ser usado de forma independente ou em conjunto com outras APIs e serviços da Plataforma Google Maps. O componente usa um ID do lugar, um nome de recurso ou coordenadas de latitude/longitude e retorna informações renderizadas de Detalhes do lugar.
O componente Place Details é totalmente temático, permitindo personalizar fontes, cores e raios de canto para corresponder ao seu caso de uso e às diretrizes da marca visual. Para personalizar a aparência dos detalhes do lugar, crie um tema que estenda PlacesMaterialTheme
e forneça substituições para os atributos do tema. Você também pode personalizar quais campos de detalhes do lugar serão incluídos especificando uma lista de entradas de conteúdo, cada uma correspondendo a uma informação mostrada sobre o lugar.
Variantes de layout
O componente Place Details oferece suporte a duas variantes principais de layout:
- Compacto:um layout para visualizar informações importantes.
- Completo:um layout abrangente que mostra todos os detalhes disponíveis do lugar.
O layout compacto pode ser mostrado na orientação vertical ou horizontal. Isso permite integrar o componente a vários layouts de design e tamanhos de tela. O layout completo só pode ser exibido na vertical.

O componente "Detalhes do lugar" oferece controle granular sobre o conteúdo exibido. Cada elemento (como fotos, avaliações e informações de contato) pode ser mostrado ou ocultado individualmente, permitindo uma personalização precisa da aparência dos componentes e da densidade de informações.

Visualização compacta de detalhes do lugar
O fragmento compacto do Place Details (PlaceDetailsCompactFragment
) renderiza detalhes de um lugar selecionado usando o mínimo de espaço. Isso pode ser útil em uma janela de informações que destaca um lugar em um mapa, em uma experiência de mídia social, como compartilhar um local em um chat, como uma sugestão para selecionar seu local atual ou em um artigo de mídia para referenciar o lugar no Google Maps.
Visualização completa do Place Details
A visualização completa de detalhes do lugar (PlaceDetailsFragment
) oferece uma superfície maior para mostrar informações sobre o lugar e permite exibir mais tipos de informações.
Opções de exibição de conteúdo
É possível especificar qual conteúdo mostrar usando as enumerações em PlaceDetailsCompactFragment.Content
ou PlaceDetailsFragment.Content
.
Visualização compacta | Visualização completa |
---|---|
|
|
Faturamento
Ao usar o kit de interface do Place Details, você recebe uma cobrança a cada vez que o método .loadWithPlaceId()
, .loadWithResourceName()
ou loadWithCoordinates()
é chamado. Se você carregar o mesmo lugar várias vezes, cada solicitação será cobrada.
Para evitar cobranças múltiplas, não adicione diretamente .loadWithPlaceId()
ou .loadWithResourceName()
em métodos de ciclo de vida do Android. Por exemplo, não chame diretamente .loadWithPlaceId()
ou .loadWithResourceName()
no método onResume()
.
Adicionar Place Details ao seu app
Para adicionar detalhes de lugar ao seu app, adicione um fragmento a um layout. Ao instanciar o fragmento, você pode personalizar a aparência das informações de detalhes do lugar para atender às suas necessidades e corresponder à aparência do seu app. Saiba mais sobre a personalização.
Você tem três métodos disponíveis em Kotlin e Java: um para carregar o fragmento com um ID de lugar (loadWithPlaceId()
), um para carregar o fragmento com um nome de recurso (loadWithResourceName()
) e um para carregar o fragmento com coordenadas de latitude/longitude (loadWithCoordinates()
). Você pode escolher qualquer método ou vários.
A posição padrão da visualização compacta é vertical. Se você quiser um layout horizontal, especifique Orientation.HORIZONTAL
. Também é possível especificar Orientation.VERTICAL
para maior clareza. A visualização completa só pode ser mostrada na vertical.
Confira exemplos na seção Exemplos de componentes de detalhes do lugar.
Personalizar a aparência visual

O kit de interface do Places oferece uma abordagem de sistema de design para personalização visual baseada no Material Design (com algumas modificações específicas do Google Maps). Consulte a referência do Material Design para Cor e Tipografia. Por padrão, o estilo segue a linguagem de design visual do Google Maps.

Ao instanciar um fragmento, você pode especificar um tema que substitui qualquer um dos atributos de estilo padrão. Todos os atributos do tema que não forem substituídos usarão os estilos padrão. Se quiser oferecer suporte a um tema escuro, adicione uma entrada para a cor em values-night/colors.xml
.
<style name="CustomizedPlaceDetailsTheme" parent="PlacesMaterialTheme"> <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>
É possível personalizar os seguintes estilos:

Atributo do tema | Uso |
---|---|
Cor | |
placesColorSurface |
Segundo plano do contêiner e da caixa de diálogo |
placesColorOutlineDecorative |
Borda do contêiner |
placesColorPrimary |
Links, indicador de carregamento, ícones de visão geral |
placesColorOnSurface |
Títulos, conteúdo da caixa de diálogo |
placesColorOnSurfaceVariant |
Informações sobre o lugar |
placesColorSecondaryContainer |
Plano de fundo do botão |
placesColorOnSecondaryContainer |
Texto e ícone do botão |
placesColorNeutralContainer |
Revisar o selo de data, carregar formas de marcador de posição |
placesColorOnNeutralContainer |
Data da revisão, erro de carregamento |
placesColorPositiveContainer |
Selo de carregador de VE disponível |
placesColorOnPositiveContainer |
Conteúdo disponível do selo de carregador de VE |
placesColorPositive |
Colocar o marcador "Aberto agora" |
placesColorNegative |
O rótulo "Fechado" agora está no lugar |
placesColorInfo |
Ícone de entrada acessível |
placesColorButtonBorder |
Botões "Abrir no Maps" e "OK" |
Tipografia | |
placesTextAppearanceBodySmall |
Informações sobre o lugar |
placesTextAppearanceBodyMedium |
Informações do lugar, conteúdo da caixa de diálogo |
placesTextAppearanceLabelMedium |
Conteúdo do selo |
placesTextAppearanceLabelLarge |
Conteúdo do botão |
placesTextAppearanceHeadlineMedium |
Títulos de caixa de diálogo |
placesTextAppearanceDisplaySmall |
Nome do lugar |
placesTextAppearanceTitleSmall |
Nome do lugar |
Espaçamento | |
placesSpacingExtraSmall |
|
placesSpacingSmall |
|
placesSpacingMedium |
|
placesSpacingLarge |
|
placesSpacingExtraLarge |
|
placesSpacingTwoExtraLarge |
|
Medição | |
placesBorderWidth |
Contêiner |
placesBorderWidthButton |
|
Forma | |
placesCornerRadius |
Contêiner |
placesCornerRadiusButton |
Botões "Abrir no Maps" e "OK" (exclui o botão de ícone redondo) |
placesCornerRadiusThumbnail |
Colocar imagem em miniatura |
placesCornerRadiusCollageOuter |
Colagem de mídia |
placesCornerRadiusCard |
Card de lugar, card de avaliação do usuário |
placesCornerRadiusDialog |
Caixa de diálogo de divulgação do Google Maps |
Atribuição de marca do Google Maps | |
placesColorAttributionLightTheme |
Botão de atribuição e divulgação do Google Maps no tema claro (enums para branco, cinza e preto) |
placesColorAttributionDarkTheme |
Botão de atribuição e divulgação do Google Maps no tema escuro (enums para branco, cinza e preto) |
Confira exemplos na seção Exemplos de componentes de detalhes do lugar.
Personalização de largura e altura
Visualizações compactas
Larguras recomendadas:
- Orientação vertical: entre 180 dp e 300 dp.
- Orientação horizontal: entre 180 dp e 500 dp.
Larguras menores que 160 dp podem não ser exibidas corretamente.
A prática recomendada é não definir uma altura para as visualizações compactas. Isso permite que o conteúdo na janela defina a altura, mostrando todas as informações.
Visualizações completas
Para visualizações completas, a largura recomendada é entre 250 dp e 450 dp. Uma largura menor que 250 dp pode não ser exibida corretamente.
É possível definir a altura do componente: a visualização vertical de detalhes do lugar rola verticalmente dentro do espaço alocado.
A prática recomendada é definir uma altura para visualizações completas. Isso permite que o conteúdo na janela role corretamente.
Cores de atribuição

Os Termos de Serviço do Google Maps exigem que você use uma das três cores da marca para a atribuição do Google Maps. Essa atribuição precisa estar visível e acessível quando as mudanças de personalização forem feitas.
Oferecemos três cores de marca para escolher, que podem ser definidas de forma independente para temas claros e escuros:
- Tema claro:
placesColorAttributionLight
com valores de enumeração para branco, cinza e preto. - Tema escuro:
placesColorAttributionDark
com valores de enumeração para branco, cinza e preto.
Exemplos de componentes Place Details
Criar uma visualização compacta ou completa
Kotlin
// We create a new instance of the fragment using its factory method. // We can specify which content to show, the orientation, and a custom theme. val fragment = PlaceDetailsCompactFragment.newInstance( PlaceDetailsCompactFragment.ALL_CONTENT, // Show all available content. orientation, R.style.CustomizedPlaceDetailsTheme, ).apply { // The PlaceLoadListener provides callbacks for when the place data is successfully // loaded or when an error occurs. This is where we update our UI state. setPlaceLoadListener(object : PlaceLoadListener { override fun onSuccess(place: Place) { Log.d(TAG, "Place loaded: ${place.id}") // Once the data is loaded, we hide the loading indicator and show the fragment. binding.loadingIndicatorMain.visibility = View.GONE binding.placeDetailsContainer.visibility = View.VISIBLE binding.dismissButton.visibility = View.VISIBLE } override fun onFailure(e: Exception) { Log.e(TAG, "Place failed to load", e) // On failure, we hide the UI and notify the user. dismissPlaceDetails() Toast.makeText(this@MainActivity, "Failed to load place details.", Toast.LENGTH_SHORT).show() } }) } // We add the fragment to our layout's container view. // `commitNow()` is used to ensure the fragment is immediately added and available, // which is important because we need to call a method on it right after. supportFragmentManager .beginTransaction() .replace(binding.placeDetailsContainer.id, fragment) .commitNow() // **This is the key step**: After adding the fragment, we call `loadWithPlaceId` // to trigger the data loading process for the selected place. // We use `post` to ensure this runs after the layout has been measured, // which can prevent potential timing issues. binding.root.post { fragment.loadWithPlaceId(placeId) } }
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);
Este exemplo de código completo determina a orientação da visualização compacta de maneira programática com base na configuração do dispositivo do usuário.
Kotlin
package com.example.placedetailsuikit import android.Manifest import android.annotation.SuppressLint import android.content.pm.PackageManager import android.content.res.Configuration import android.location.Location import android.os.Bundle import android.util.Log import android.view.View import android.widget.Toast import androidx.activity.enableEdgeToEdge import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.lifecycle.ViewModel import com.example.placedetailsuikit.databinding.ActivityMainBinding import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices 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.model.Place import com.google.android.libraries.places.widget.PlaceDetailsCompactFragment import com.google.android.libraries.places.widget.PlaceLoadListener import com.google.android.libraries.places.widget.model.Orientation private const val TAG = "PlacesUiKit" /** * A simple ViewModel to store UI state that needs to survive configuration changes. * In this case, it holds the ID of the selected place. Using a ViewModel is good practice * as it prevents data loss during events like screen rotation, ensuring a * seamless user experience. */ class MainViewModel : ViewModel() { var selectedPlaceId: String? = null } /** * This activity serves as a basic example of integrating the Place Details UI Kit. * It demonstrates the fundamental steps required: * 1. Setting up a Google Map. * 2. Requesting location permissions to center the map. * 3. Handling clicks on Points of Interest (POIs) to get a Place ID. * 4. Using the Place ID to load and display place details in a [PlaceDetailsCompactFragment]. */ class MainActivity : AppCompatActivity(), OnMapReadyCallback, GoogleMap.OnPoiClickListener { // ViewBinding provides type-safe access to views defined in the XML layout, // eliminating the need for `findViewById` and preventing null pointer exceptions. private lateinit var binding: ActivityMainBinding private var googleMap: GoogleMap? = null // The FusedLocationProviderClient is the main entry point for interacting with the // fused location provider, which intelligently manages the underlying location technologies. private lateinit var fusedLocationClient: FusedLocationProviderClient // Using registerForActivityResult is the modern, recommended approach for handling // permission requests. It decouples the request from the handling logic, making the // code cleaner and easier to manage compared to the older `onRequestPermissionsResult` callback. private lateinit var requestPermissionLauncher: ActivityResultLauncher<Array<String>> // The `by viewModels()` delegate provides a lazy-initialized ViewModel scoped to this Activity. // This ensures that we get the same ViewModel instance across configuration changes. private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // The ActivityResultLauncher is initialized here. The lambda defines the callback // that will be executed once the user responds to the permission dialog. requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> // We check if either fine or coarse location permission was granted. if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true || permissions[Manifest.permission.ACCESS_COARSE_LOCATION] == true) { Log.d(TAG, "Location permission granted by user.") fetchLastLocation() } else { // If permission is denied, we inform the user and default to a known location. // This ensures the app remains functional even without location access. Log.d(TAG, "Location permission denied by user.") Toast.makeText( this, "Location permission denied. Showing default location.", Toast.LENGTH_LONG ).show() moveToSydney() } } // enableEdgeToEdge() allows the app to draw behind the system bars for a more immersive experience. enableEdgeToEdge() binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.dismissButton.setOnClickListener { dismissPlaceDetails() } // --- Crucial: Initialize Places SDK --- // It's essential to initialize the Places SDK before making any other Places API calls. // This should ideally be done once, for example, in the Application's `onCreate`. val apiKey = BuildConfig.PLACES_API_KEY if (apiKey.isEmpty() || apiKey == "YOUR_API_KEY") { // A valid API key is required for the Places SDK to function. Log.e(TAG, "No api key") Toast.makeText( this, "Add your own API_KEY in local.properties", Toast.LENGTH_LONG ).show() finish() return } // `initializeWithNewPlacesApiEnabled` is used to opt-in to the new SDK version. Places.initializeWithNewPlacesApiEnabled(applicationContext, apiKey) fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) // ------------------------------------ // The SupportMapFragment is the container for the map. `getMapAsync` allows us to // work with the GoogleMap object via a callback once it's fully initialized. val mapFragment = supportFragmentManager.findFragmentById(R.id.map_fragment) as SupportMapFragment? mapFragment?.getMapAsync(this) // This block handles restoration after a configuration change (e.g., screen rotation). // If a place was selected before the rotation, its ID is stored in the ViewModel. // We use this ID to immediately show the details fragment again. if (viewModel.selectedPlaceId != null) { viewModel.selectedPlaceId?.let { placeId -> Log.d(TAG, "Restoring PlaceDetailsFragment for place ID: $placeId") showPlaceDetailsFragment(placeId) } } } /** * This callback is triggered when the GoogleMap object is ready to be used. * All map setup logic should be placed here. */ override fun onMapReady(map: GoogleMap) { Log.d(TAG, "Map is ready") googleMap = map // Setting the OnPoiClickListener allows us to capture user taps on points of interest. googleMap?.setOnPoiClickListener(this) // After the map is ready, we determine the initial camera position based on location permissions. if (isLocationPermissionGranted()) { fetchLastLocation() } else { requestLocationPermissions() } } /** * A helper function to centralize the check for location permissions. */ private fun isLocationPermissionGranted(): Boolean { return ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_COARSE_LOCATION ) == PackageManager.PERMISSION_GRANTED } /** * This function triggers the permission request flow. The result is handled by the * ActivityResultLauncher defined in `onCreate`. */ private fun requestLocationPermissions() { Log.d(TAG, "Requesting location permissions.") requestPermissionLauncher.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) } /** * Fetches the device's last known location. This is a fast and battery-efficient way * to get a location fix. It should only be called after verifying permissions. */ @SuppressLint("MissingPermission") private fun fetchLastLocation() { // Double-checking permissions here is a good practice, although the call sites are already guarded. if (isLocationPermissionGranted()) { fusedLocationClient.lastLocation .addOnSuccessListener { location: Location? -> if (location != null) { val userLocation = LatLng(location.latitude, location.longitude) googleMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 13f)) Log.d(TAG, "Moved to user's last known location.") } else { // `lastLocation` can be null if the location has never been recorded. // In this case, we fall back to a default location. Log.d(TAG, "Last known location is null. Falling back to Sydney.") moveToSydney() } } .addOnFailureListener { // This listener handles errors in the location fetching process. Log.e(TAG, "Failed to get location.", it) moveToSydney() } } } /** * Moves the map camera to a default, hardcoded location (Sydney). * This serves as a reliable fallback. */ private fun moveToSydney() { val sydney = LatLng(-33.8688, 151.2093) googleMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13f)) Log.d(TAG, "Moved to Sydney") } /** * This is the callback for the `OnPoiClickListener`. It's triggered when a user * taps a POI on the map. */ override fun onPoiClick(poi: PointOfInterest) { val placeId = poi.placeId Log.d(TAG, "Place ID: $placeId") // We save the selected place ID to the ViewModel. This is critical for surviving // configuration changes. If the user rotates the screen now, the `onCreate` // method will be able to restore the place details view. viewModel.selectedPlaceId = placeId showPlaceDetailsFragment(placeId) } /** * This function is the core of the integration. It creates, configures, and displays * the [PlaceDetailsCompactFragment]. * @param placeId The unique identifier for the place to be displayed. */ private fun showPlaceDetailsFragment(placeId: String) { Log.d(TAG, "Showing PlaceDetailsFragment for place ID: $placeId") // We manage the visibility of UI elements to provide feedback to the user. // The wrapper is shown, and a loading indicator is displayed while the data is fetched. binding.placeDetailsWrapper.visibility = View.VISIBLE binding.dismissButton.visibility = View.GONE binding.placeDetailsContainer.visibility = View.GONE binding.loadingIndicatorMain.visibility = View.VISIBLE // The Place Details widget can be displayed vertically or horizontally. // We dynamically choose the orientation based on the device's current configuration. val orientation = if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { Orientation.HORIZONTAL } else { Orientation.VERTICAL } // We create a new instance of the fragment using its factory method. // We can specify which content to show, the orientation, and a custom theme. val fragment = PlaceDetailsCompactFragment.newInstance( PlaceDetailsCompactFragment.ALL_CONTENT, // Show all available content. orientation, R.style.CustomizedPlaceDetailsTheme, ).apply { // The PlaceLoadListener provides callbacks for when the place data is successfully // loaded or when an error occurs. This is where we update our UI state. setPlaceLoadListener(object : PlaceLoadListener { override fun onSuccess(place: Place) { Log.d(TAG, "Place loaded: ${place.id}") // Once the data is loaded, we hide the loading indicator and show the fragment. binding.loadingIndicatorMain.visibility = View.GONE binding.placeDetailsContainer.visibility = View.VISIBLE binding.dismissButton.visibility = View.VISIBLE } override fun onFailure(e: Exception) { Log.e(TAG, "Place failed to load", e) // On failure, we hide the UI and notify the user. dismissPlaceDetails() Toast.makeText(this@MainActivity, "Failed to load place details.", Toast.LENGTH_SHORT).show() } }) } // We add the fragment to our layout's container view. // `commitNow()` is used to ensure the fragment is immediately added and available, // which is important because we need to call a method on it right after. supportFragmentManager .beginTransaction() .replace(binding.placeDetailsContainer.id, fragment) .commitNow() // **This is the key step**: After adding the fragment, we call `loadWithPlaceId` // to trigger the data loading process for the selected place. // We use `post` to ensure this runs after the layout has been measured, // which can prevent potential timing issues. binding.root.post { fragment.loadWithPlaceId(placeId) } } /** * Hides the place details view and clears the selected place ID from the ViewModel. */ private fun dismissPlaceDetails() { binding.placeDetailsWrapper.visibility = View.GONE // Clearing the ID in the ViewModel is important so that if the user rotates the // screen after dismissing, the details view doesn't reappear. viewModel.selectedPlaceId = null } override fun onDestroy() { super.onDestroy() // It's a good practice to nullify references to objects that have a lifecycle // tied to the activity, like the GoogleMap object, to prevent potential memory leaks. googleMap = null } }
Criar um tema
Ao instanciar um fragmento, você pode especificar um tema que substitui qualquer um dos atributos de estilo padrão. Todos os atributos do tema que não forem substituídos usarão os estilos padrão. Se quiser oferecer suporte a um tema escuro, adicione uma entrada para a cor em values-night/colors.xml
.
<style name="CustomizedPlaceDetailsTheme" parent="PlacesMaterialTheme"> <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>
Usar conteúdo padrão
Este exemplo usa o conteúdo padrão.
val fragmentStandardContent = PlaceDetailsCompactFragment.newInstance( PlaceDetailsCompactFragment.STANDARD_CONTENT, orientation, R.style.CustomizedPlaceDetailsTheme )
Personalizar conteúdo específico
Essa amostra seleciona apenas o endereço, a entrada acessível e as opções de mídia Content
para uma visualização compacta e as renderiza com o CustomizedPlaceDetailsTheme
.
val placeDetailsFragment = PlaceDetailsCompactFragment.newInstance( orientation, listOf( Content.ADDRESS, Content.ACCESSIBLE_ENTRANCE, Content.MEDIA ), R.style.CustomizedPlaceDetailsTheme )
Usar todo o conteúdo
Este exemplo usa todas as opções de Content
de uma visualização compacta.
val fragmentAllContent = PlaceDetailsCompactFragment.newInstance( orientation, PlaceDetailsCompactFragment.ALL_CONTENT, R.style.CustomizedPlaceDetailsTheme )