Skip to content

Style Switching (Android)

Switch between SmartMaps styles at runtime, for example to support dark mode.

MapSession required

Remember to integrate the MapSession in your app. The MapSession must be called periodically every 10 minutes while the map is active.

Automatic Dark Mode

import android.content.res.Configuration

class MainActivity : AppCompatActivity() {
    private lateinit var mapView: MapView
    private val apiKey = "[INSERT API-KEY]"

    private fun getStyleUrl(): String {
        val isDarkMode = resources.configuration.uiMode and
            Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES

        val styleName = if (isDarkMode) "dark" else "light"
        return "https://tiles.smartmaps.cloud/styles/v1/smartmaps/$styleName/style.json?apiKey=$apiKey&channel=app"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        MapLibre.getInstance(this)
        setContentView(R.layout.activity_main)

        mapView = findViewById(R.id.mapView)
        mapView.onCreate(savedInstanceState)
        mapView.getMapAsync { map ->
            map.setStyle(getStyleUrl())
            map.cameraPosition = CameraPosition.Builder()
                .target(LatLng(49.0069, 8.4037))
                .zoom(12.0)
                .build()
        }
    }

    // Re-apply style when configuration changes
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        mapView.getMapAsync { map ->
            map.setStyle(getStyleUrl())
        }
    }

    // Lifecycle methods
    override fun onStart() { super.onStart(); mapView.onStart() }
    override fun onResume() { super.onResume(); mapView.onResume() }
    override fun onPause() { super.onPause(); mapView.onPause() }
    override fun onStop() { super.onStop(); mapView.onStop() }
    override fun onDestroy() { super.onDestroy(); mapView.onDestroy() }
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mapView.onSaveInstanceState(outState)
    }
    override fun onLowMemory() { super.onLowMemory(); mapView.onLowMemory() }
}

Style Picker with Buttons

mapView.getMapAsync { map ->
    map.setStyle(
        "https://tiles.smartmaps.cloud/styles/v1/smartmaps/light/style.json?apiKey=$apiKey&channel=app"
    )

    val styles = mapOf(
        R.id.btnLight to "light",
        R.id.btnDark to "dark",
        R.id.btnGrey to "grey",
        R.id.btnEssential to "essential",
        R.id.btnAccessible to "accessible",
        R.id.btnSatellite to "satellite"
    )

    styles.forEach { (buttonId, styleName) ->
        findViewById<Button>(buttonId).setOnClickListener {
            map.setStyle(
                "https://tiles.smartmaps.cloud/styles/v1/smartmaps/$styleName/style.json?apiKey=$apiKey&channel=app"
            )
        }
    }
}