Advertisement
tuomasvaltanen

Untitled

Feb 10th, 2023 (edited)
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.67 KB | None | 0 0
  1. // Edistynyt mobiiliohjelmointi, 10.2.2023
  2.  
  3. CommentAdapter -> bindComment
  4.  
  5. // viilataan kommentin nimeä hieman lyhemmäksi ettei mene päällekkäin emailin kanssa
  6.  
  7. fun bindComment(comment : Comment)
  8. {
  9. this.comment = comment
  10.  
  11. // asetetaan oikeat datat oikeaan kohtaan
  12. // ulkoasussa
  13. view.textViewCommentEmail.text = comment.email.toString()
  14.  
  15. // jos kommentin nimi on liian pitkä -> lyhennetään ja perään kolme pistettä
  16. var commentName : String = comment.name.toString()
  17.  
  18. if(commentName.length > 20){
  19. commentName = commentName.substring(0, 20) + "..."
  20. }
  21.  
  22. // asetetaan muut tiedot ulkoasuun
  23. view.textViewCommentName.text = commentName
  24. view.textViewCommentBody.text = comment.body.toString()
  25. }
  26.  
  27.  
  28. CommentHolderissa, onClick:
  29.  
  30. // jos itemiä klikataan käyttöliittymässä, ajetaan tämä koodio
  31. override fun onClick(v: View) {
  32. // koska bindCommentissa tallennettiin aktiivinen comment-olio talteen
  33. // saamme näppärästi comment-oliosta haettua klikatun kommentin id:n ja muut tiedot
  34. Log.d("TESTI", "RecyclerView CLICK! " + comment?.id.toString())
  35.  
  36. // tätä varten tulee tehdä CommentDetailFragment navigaatioeditorin kautta.
  37. // lisää action CommentApiFragmentista CommentDetailFragmentiin, ja
  38. // CommentDetailFragmentiin argumentti id, tyyppiä Int ja oletusarvo - 1
  39. val action = CommentApiFragmentDirections.actionCommentApiFragmentToCommentDetailFragment(comment?.id as Int)
  40. v.findNavController().navigate(action)
  41. }
  42.  
  43.  
  44. // CommentDetailFragment, esim.
  45.  
  46. class CommentDetailFragment : Fragment() {
  47. // change this to match your fragment name
  48. private var _binding: FragmentCommentDetailBinding? = null
  49.  
  50. val args: CommentDetailFragmentArgs by navArgs()
  51. // This property is only valid between onCreateView and
  52. // onDestroyView.
  53. private val binding get() = _binding!!
  54.  
  55. override fun onCreateView(
  56. inflater: LayoutInflater,
  57. container: ViewGroup?,
  58. savedInstanceState: Bundle?
  59. ): View? {
  60. _binding = FragmentCommentDetailBinding.inflate(inflater, container, false)
  61. val root: View = binding.root
  62.  
  63. Log.d("TESTI", "id:" + args.id.toString())
  64. // the binding -object allows you to access views in the layout, textviews etc.
  65.  
  66. // rakennetaan id-argumentin avulla uusi JSON_URL, VOLLLEYTÄ VARTEN
  67. // toisin sanoen, URL viittaa yksittäiseen kommenttiin rajapinnassa id:n perusteella
  68. val JSON_URL = "https://jsonplaceholder.typicode.com/comments/" + args.id.toString()
  69. Log.d("TESTI", JSON_URL)
  70.  
  71. // pääasiassa kolme eri lähestymistapaa, miten jatkaa tästä:
  72.  
  73. // VAIHTOEHTO 1: ota vastaan pelkkä klikattu id (kuten tässä nyt), ja hae sitä vastaava
  74. // data Volleylla uudestaan. Huom: koska nyt haetaan vain yhden kommentin data kerrallaan,
  75. // käytetään GSONin osalta yksinkertaisempaa versiota, esim.
  76.  
  77. // var item : Comment = gson.fromJson(response, Comment::class.java)
  78. // tämän jälkeen asetetaan dataa ulkoasuun miten halutaan esim.
  79. // binding.jokutextview.text = item.name.toString() jne.
  80.  
  81. // hyvät puolet: aina ajantasainen data
  82. // huonot puolet: enemmän koodia, enemmän tietoliikennettä
  83.  
  84. // VAIHTOEHTO 2: lähetä edellisestä fragmentista lisää argumentteja, eli kaikki muutkin
  85. // yhden kommentin tiedot (nimi, email, body jne)
  86.  
  87. // hyvät puolet: helppo koodata / vähän koodia
  88. // huonot puolet: data saattaa olla vanhentunut. jos data-luokassa on paljon kenttiä,
  89. // argumenttien määrä kasvaa suureksi
  90.  
  91. // VAIHTOEHTO 3: lähetä edellisestä fragmentista koko comment-olio JSON-formaatissa (käytä GSONia)
  92. // tässä detail-fragmentissa, pura JSON takaisin Kotlin-olioksi.
  93.  
  94. // hyvät puolet: suurikaan määrä argumentteja ei haittaa, koska kaikki on vain yhdessä JSONissa
  95. // huonot puolet: data saattaa olla vanhentunut, vaatii hieman lisää koodia GSONin osalta
  96.  
  97. return root
  98. }
  99.  
  100. override fun onDestroyView() {
  101. super.onDestroyView()
  102. _binding = null
  103. }
  104. }
  105.  
  106. // ------------------------------------------
  107. // Harjoitus 2 - Google Maps
  108. // ------------------------------------------
  109.  
  110. Luo ensin Google Maps API key, ks. ohje Moodlessa. Google Maps ei toimi Androidissa ilman voimassa olevaa API keytä.
  111.  
  112. Luo navigaatioeditorin kautta uusi fragment (Google Maps Fragment), ja laita se päävalikkoon (res -> menu -> activity_main_drawer.xml sekä MainActivity.kt)
  113.  
  114. Gradle Scripts -> local.properties-tiedosto:
  115.  
  116. Lisää tänne uusi muuttuja nimeltä MAPS_API_KEY, johon asetetaan oma Google MAPS API key. ALLA OLEVA ESIMERKKI EI OLE OIKEA API KEY:
  117.  
  118. MAPS_API_KEY=AIzfdsÖFKLHDLFJKaFJHDJHKFGDSHsFJKHDSKLJGhfjldaghlrieah
  119.  
  120. AndroidManifest.xml -> kytketään MAPS_API_KEY -muuttuja tällä tavalla:
  121.  
  122. <meta-data
  123. android:name="com.google.android.geo.API_KEY"
  124. android:value="${MAPS_API_KEY}" />
  125.  
  126. MapsFragment:
  127.  
  128. class MapsFragment : Fragment() {
  129.  
  130. // tämä callback ajetaan silloin, kun Google Maps on ladattu
  131. // fragmenttiin onnistuneesti
  132. private val callback = OnMapReadyCallback { googleMap ->
  133.  
  134. val sydney = LatLng(-34.0, 151.0)
  135. googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  136.  
  137. val rovaniemi = LatLng(66.50336579596632, 25.727513206740678)
  138. googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi!"))
  139.  
  140. // siirretään alkunäkymä
  141. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 15f))
  142. }
  143.  
  144. override fun onCreateView(
  145. inflater: LayoutInflater,
  146. container: ViewGroup?,
  147. savedInstanceState: Bundle?
  148. ): View? {
  149. return inflater.inflate(R.layout.fragment_maps, container, false)
  150. }
  151.  
  152. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  153. super.onViewCreated(view, savedInstanceState)
  154. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  155. mapFragment?.getMapAsync(callback)
  156. }
  157. }
  158.  
  159. // otetaan binding layer käyttöön:
  160.  
  161. class MapsFragment : Fragment() {
  162.  
  163. // change this to match your fragment name
  164. private var _binding: FragmentMapsBinding? = null
  165.  
  166. // This property is only valid between onCreateView and
  167. // onDestroyView.
  168. private val binding get() = _binding!!
  169.  
  170.  
  171. // tämä callback ajetaan silloin, kun Google Maps on ladattu
  172. // fragmenttiin onnistuneesti
  173. private val callback = OnMapReadyCallback { googleMap ->
  174.  
  175. val sydney = LatLng(-34.0, 151.0)
  176. googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  177.  
  178. val rovaniemi = LatLng(66.50336579596632, 25.727513206740678)
  179. googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi!"))
  180.  
  181. // siirretään alkunäkymä
  182. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 15f))
  183. }
  184.  
  185. override fun onCreateView(
  186. inflater: LayoutInflater,
  187. container: ViewGroup?,
  188. savedInstanceState: Bundle?
  189. ): View? {
  190. _binding = FragmentMapsBinding.inflate(inflater, container, false)
  191. val root: View = binding.root
  192.  
  193. return root
  194. }
  195.  
  196. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  197. super.onViewCreated(view, savedInstanceState)
  198. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  199. mapFragment?.getMapAsync(callback)
  200. }
  201.  
  202. override fun onDestroyView() {
  203. super.onDestroyView()
  204. _binding = null
  205. }
  206. }
  207.  
  208. // MapsFragmentin ulkoasu xml:, muokataan jotta saadaan ConstraintLayoutin sisälle kartta, jotta
  209. // voimme lisätä uusia ominaisuuksia kartan päälle:
  210.  
  211. <?xml version="1.0" encoding="utf-8"?>
  212. <androidx.constraintlayout.widget.ConstraintLayout
  213. xmlns:android="http://schemas.android.com/apk/res/android"
  214. xmlns:tools="http://schemas.android.com/tools"
  215. tools:context=".MapsFragment"
  216. android:layout_width="match_parent"
  217. android:layout_height="match_parent">
  218.  
  219. <fragment
  220. android:id="@+id/map"
  221. android:name="com.google.android.gms.maps.SupportMapFragment"
  222. android:layout_width="match_parent"
  223. android:layout_height="match_parent" />
  224.  
  225. </androidx.constraintlayout.widget.ConstraintLayout>
  226.  
  227. // Jotta pääsemme eroon "Unknown fragments" -ongelmasta, joka estää meitä käyttämästä Design-näkymään, lisää fragment-tagiin:
  228.  
  229. tools:layout="@layout/fragment_home"
  230.  
  231.  
  232. ... eli kokonaisuudessaan nyt (lisätty myös contraintit):
  233.  
  234. <?xml version="1.0" encoding="utf-8"?>
  235. <androidx.constraintlayout.widget.ConstraintLayout
  236. xmlns:android="http://schemas.android.com/apk/res/android"
  237. xmlns:app="http://schemas.android.com/apk/res-auto"
  238. xmlns:tools="http://schemas.android.com/tools"
  239. tools:context=".MapsFragment"
  240. android:layout_width="match_parent"
  241. android:layout_height="match_parent">
  242.  
  243. <fragment
  244. android:id="@+id/map"
  245. android:name="com.google.android.gms.maps.SupportMapFragment"
  246. android:layout_width="match_parent"
  247. android:layout_height="match_parent"
  248. app:layout_constraintBottom_toBottomOf="parent"
  249. app:layout_constraintEnd_toEndOf="parent"
  250. app:layout_constraintStart_toStartOf="parent"
  251. app:layout_constraintTop_toTopOf="parent"
  252. tools:layout="@layout/fragment_home" />
  253.  
  254. </androidx.constraintlayout.widget.ConstraintLayout>
  255.  
  256.  
  257.  
  258. // lisätään CheckBox ulkoasuun:
  259.  
  260. <CheckBox
  261. android:id="@+id/checkBox_zoom_controls"
  262. android:layout_width="wrap_content"
  263. android:layout_height="wrap_content"
  264. android:layout_margin="10dp"
  265. android:text="Zoom ON/OFF"
  266. app:layout_constraintStart_toStartOf="parent"
  267. app:layout_constraintTop_toTopOf="parent" />
  268.  
  269. // MapsFragment, otetaan googleMaps-olio talteen, jotta voimme käsitellä sitä muualtakin
  270.  
  271. class MapsFragment : Fragment() {
  272.  
  273. // change this to match your fragment name
  274. private var _binding: FragmentMapsBinding? = null
  275.  
  276. // This property is only valid between onCreateView and
  277. // onDestroyView.
  278. private val binding get() = _binding!!
  279.  
  280. // jotta pääsemme googleMap-olioon muualtakin käsiksi:
  281. private lateinit var gMap : GoogleMap
  282.  
  283. // tämä callback ajetaan silloin, kun Google Maps on ladattu
  284. // fragmenttiin onnistuneesti
  285. private val callback = OnMapReadyCallback { googleMap ->
  286. // asetetaan googleMap -olio talteen ylätasolla (luokkaan jäsenmuuttujaksi)
  287. gMap = googleMap
  288.  
  289. val sydney = LatLng(-34.0, 151.0)
  290. googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  291.  
  292. val rovaniemi = LatLng(66.50336579596632, 25.727513206740678)
  293. googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi!"))
  294.  
  295. // siirretään alkunäkymä
  296. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 15f))
  297. }
  298.  
  299. override fun onCreateView(
  300. inflater: LayoutInflater,
  301. container: ViewGroup?,
  302. savedInstanceState: Bundle?
  303. ): View? {
  304. _binding = FragmentMapsBinding.inflate(inflater, container, false)
  305. val root: View = binding.root
  306.  
  307. // checkboxin event handler -> zoom-kontrollit joko päälle tai pois
  308. binding.checkBoxZoomControls.setOnCheckedChangeListener { compoundButton, b ->
  309. gMap.uiSettings.isZoomControlsEnabled = b
  310. }
  311.  
  312. return root
  313. }
  314.  
  315. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  316. super.onViewCreated(view, savedInstanceState)
  317. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  318. mapFragment?.getMapAsync(callback)
  319. }
  320.  
  321. override fun onDestroyView() {
  322. super.onDestroyView()
  323. _binding = null
  324. }
  325. }
  326.  
  327. // Zoom-controllit jäävät email-painikkeen alle, res -> layout -> app_bar_main.xml , asetetaan FloatingActionButton piiloon:
  328.  
  329. android:visibility="invisible"
  330.  
  331.  
  332. // maps fragment layout xml:, lisätään RadioGroup + RadioButtonit 2 kpl
  333.  
  334. <?xml version="1.0" encoding="utf-8"?>
  335. <androidx.constraintlayout.widget.ConstraintLayout
  336. xmlns:android="http://schemas.android.com/apk/res/android"
  337. xmlns:app="http://schemas.android.com/apk/res-auto"
  338. xmlns:tools="http://schemas.android.com/tools"
  339. tools:context=".MapsFragment"
  340. android:layout_width="match_parent"
  341. android:layout_height="match_parent">
  342.  
  343. <fragment
  344. android:id="@+id/map"
  345. android:name="com.google.android.gms.maps.SupportMapFragment"
  346. android:layout_width="match_parent"
  347. android:layout_height="match_parent"
  348. app:layout_constraintBottom_toBottomOf="parent"
  349. app:layout_constraintEnd_toEndOf="parent"
  350. app:layout_constraintStart_toStartOf="parent"
  351. app:layout_constraintTop_toTopOf="parent"
  352. tools:layout="@layout/fragment_home" />
  353.  
  354. <CheckBox
  355. android:id="@+id/checkBox_zoom_controls"
  356. android:layout_width="wrap_content"
  357. android:layout_height="wrap_content"
  358. android:layout_margin="10dp"
  359. android:text="Zoom ON/OFF"
  360. app:layout_constraintStart_toStartOf="parent"
  361. app:layout_constraintTop_toTopOf="parent" />
  362.  
  363. <RadioGroup
  364. android:layout_width="wrap_content"
  365. android:layout_height="wrap_content"
  366. android:layout_margin="10dp"
  367. app:layout_constraintEnd_toEndOf="parent"
  368. app:layout_constraintTop_toTopOf="parent">
  369.  
  370. <RadioButton
  371. android:id="@+id/radioButton_normal_map"
  372. android:layout_width="match_parent"
  373. android:layout_height="wrap_content"
  374. android:checked="true"
  375. android:text="Normal" />
  376.  
  377. <RadioButton
  378. android:id="@+id/radioButton_hybrid_map"
  379. android:layout_width="match_parent"
  380. android:layout_height="wrap_content"
  381. android:text="Hybrid" />
  382. </RadioGroup>
  383.  
  384. </androidx.constraintlayout.widget.ConstraintLayout>
  385.  
  386. // MapsFragment.kt -> lisätään radiobuttonit:
  387.  
  388. class MapsFragment : Fragment() {
  389.  
  390. // change this to match your fragment name
  391. private var _binding: FragmentMapsBinding? = null
  392.  
  393. // This property is only valid between onCreateView and
  394. // onDestroyView.
  395. private val binding get() = _binding!!
  396.  
  397. // jotta pääsemme googleMap-olioon muualtakin käsiksi:
  398. private lateinit var gMap : GoogleMap
  399.  
  400. // tämä callback ajetaan silloin, kun Google Maps on ladattu
  401. // fragmenttiin onnistuneesti
  402. private val callback = OnMapReadyCallback { googleMap ->
  403. // asetetaan googleMap -olio talteen ylätasolla (luokkaan jäsenmuuttujaksi)
  404. gMap = googleMap
  405.  
  406. val sydney = LatLng(-34.0, 151.0)
  407. googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  408.  
  409. val rovaniemi = LatLng(66.50336579596632, 25.727513206740678)
  410. googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi!"))
  411.  
  412. // siirretään alkunäkymä
  413. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 15f))
  414. }
  415.  
  416. override fun onCreateView(
  417. inflater: LayoutInflater,
  418. container: ViewGroup?,
  419. savedInstanceState: Bundle?
  420. ): View? {
  421. _binding = FragmentMapsBinding.inflate(inflater, container, false)
  422. val root: View = binding.root
  423.  
  424. // checkboxin event handler -> zoom-kontrollit joko päälle tai pois
  425. binding.checkBoxZoomControls.setOnCheckedChangeListener { compoundButton, b ->
  426. gMap.uiSettings.isZoomControlsEnabled = b
  427. }
  428.  
  429. // radio button 1, tarvitsemme if-lauseen tarkistamaan että valinta on päällä, koska muuten
  430. // radiobuttonit "tappelevat" keskenään kumpi karttatyyppi on nyt oikeasti päällä
  431. // huom: tämä funktio käynnistyy molempiin suuntiin, eli kun valinta laitetaan päälle tai otetaan pois
  432. binding.radioButtonNormalMap.setOnCheckedChangeListener { compoundButton, b ->
  433. if(compoundButton.isChecked) {
  434. gMap.mapType = GoogleMap.MAP_TYPE_NORMAL
  435. }
  436. }
  437.  
  438. // radio button 2
  439. binding.radioButtonHybridMap.setOnCheckedChangeListener { compoundButton, b ->
  440. if(compoundButton.isChecked) {
  441. gMap.mapType = GoogleMap.MAP_TYPE_HYBRID
  442. }
  443. }
  444.  
  445. return root
  446. }
  447.  
  448. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  449. super.onViewCreated(view, savedInstanceState)
  450. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  451. mapFragment?.getMapAsync(callback)
  452. }
  453.  
  454. override fun onDestroyView() {
  455. super.onDestroyView()
  456. _binding = null
  457. }
  458. }
  459.  
  460. // MapsFragment, onMarkerClick eli kun markkeria klikataan, lisätään tuki:
  461.  
  462. class MapsFragment : Fragment(), GoogleMap.OnMarkerClickListener {
  463.  
  464. // change this to match your fragment name
  465. private var _binding: FragmentMapsBinding? = null
  466.  
  467. // This property is only valid between onCreateView and
  468. // onDestroyView.
  469. private val binding get() = _binding!!
  470.  
  471. // jotta pääsemme googleMap-olioon muualtakin käsiksi:
  472. private lateinit var gMap : GoogleMap
  473.  
  474. // tämä callback ajetaan silloin, kun Google Maps on ladattu
  475. // fragmenttiin onnistuneesti
  476. private val callback = OnMapReadyCallback { googleMap ->
  477. // asetetaan googleMap -olio talteen ylätasolla (luokkaan jäsenmuuttujaksi)
  478. gMap = googleMap
  479.  
  480. // tallennetaan Sydneyn ja Rovaniemen markkerit muuttujiin, jotta voimme laittaa dataa
  481. // mukaan tagin avulla. tag löytyy kaikista Androidin View-tyyppisistä olioista!
  482. val sydney = LatLng(-34.0, 151.0)
  483. var marker1 : Marker? = googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  484. marker1?.tag = "Sydney"
  485.  
  486. val rovaniemi = LatLng(66.50336579596632, 25.727513206740678)
  487. var marker2 : Marker? = googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi!"))
  488. marker2?.tag = "Rovaniemi"
  489.  
  490. // siirretään alkunäkymä
  491. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 15f))
  492.  
  493. // asetetaan että tämä luokka (MapsFragment) hoitaa Marker-klikkaukset
  494. // ks. alimmaisena oleva OnMarkerClickListener
  495. googleMap.setOnMarkerClickListener(this)
  496. }
  497.  
  498. override fun onCreateView(
  499. inflater: LayoutInflater,
  500. container: ViewGroup?,
  501. savedInstanceState: Bundle?
  502. ): View? {
  503. _binding = FragmentMapsBinding.inflate(inflater, container, false)
  504. val root: View = binding.root
  505.  
  506. // checkboxin event handler -> zoom-kontrollit joko päälle tai pois
  507. binding.checkBoxZoomControls.setOnCheckedChangeListener { compoundButton, b ->
  508. gMap.uiSettings.isZoomControlsEnabled = b
  509. }
  510.  
  511. // radio button 1
  512. binding.radioButtonNormalMap.setOnCheckedChangeListener { compoundButton, b ->
  513. if(compoundButton.isChecked) {
  514. gMap.mapType = GoogleMap.MAP_TYPE_NORMAL
  515. }
  516. }
  517.  
  518. // radio button 2
  519. binding.radioButtonHybridMap.setOnCheckedChangeListener { compoundButton, b ->
  520. if(compoundButton.isChecked) {
  521. gMap.mapType = GoogleMap.MAP_TYPE_HYBRID
  522. }
  523. }
  524.  
  525. return root
  526. }
  527.  
  528. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  529. super.onViewCreated(view, savedInstanceState)
  530. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  531. mapFragment?.getMapAsync(callback)
  532. }
  533.  
  534. override fun onDestroyView() {
  535. super.onDestroyView()
  536. _binding = null
  537. }
  538.  
  539. // OnMarkerClickiä kutsutaan jos mitä tahansa markeria kartalla klikataan
  540. override fun onMarkerClick(p0: Marker): Boolean {
  541.  
  542. Log.d("TESTI", "MARKKERI CLICK! JES!")
  543.  
  544. // kaivetaan marker-oliosta klikatun markkerin nimi ja koordinaatit
  545. Log.d("TESTI", p0.tag.toString())
  546.  
  547. Log.d("TESTI", p0.position.latitude.toString())
  548. Log.d("TESTI", p0.position.longitude.toString())
  549.  
  550. // OnMarkerClick vaatii että lopuksi palautetaan Boolean
  551. return false
  552. }
  553. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement