Advertisement
tuomasvaltanen

Untitled

Feb 1st, 2023 (edited)
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.76 KB | None | 0 0
  1. // Edistynyt mobiiliohjelmointi 1.2.2023
  2.  
  3. class CommentHolder(v: RecyclerviewItemRowBinding) : RecyclerView.ViewHolder(v.root), View.OnClickListener {
  4.  
  5. // view => binding layer
  6. // comment => yksittäinen comment-data
  7. private var view: RecyclerviewItemRowBinding = v
  8. private var comment: Comment? = null
  9.  
  10. // v.root tarvitaan siksi, koska v on tässä tapauksessa binding layer, ei View
  11. // v.root on binding layerin pohjimmainen View, eli ulkoasu
  12. init {
  13. v.root.setOnClickListener(this)
  14. }
  15.  
  16. // tätä fuktiota kutsutaan jokaisen comment-datan kohdalla
  17. // kun se asetetaan listaan
  18. // toisin sanoen, tässä funktiossa päätetään mikä muuttuja
  19. // kytketään mihinkiin Viewiin, esim. TextViewiin
  20. fun bindComment(comment: Comment)
  21. {
  22. // laitetaan Comment -olio talteen, jotta pääsemme
  23. // siihen helpommin käsiksi esim. onClickissä
  24. this.comment = comment
  25.  
  26. // jos commentin nimi on liian pitkä, lyhennetään
  27. var commentName = comment.name as String
  28.  
  29. if(commentName.length > 20)
  30. {
  31. commentName = commentName.substring(0, 20) + "..."
  32. }
  33.  
  34. view.textViewCommentName.text = commentName
  35.  
  36. view.textViewCommentContent.text = comment.body
  37. view.textViewCommentEmail.text = comment.email
  38. }
  39.  
  40. // ApiDetailFragment on uusi fragment, identtinen DataDetailFragmentin kanssa (paitsi nimet)
  41. override fun onClick(v: View) {
  42. // huom: comment.id on Int? eli "nullable" Int, minkä vuoksi meidän pitää muuntaa se vielä Int-muotoon
  43. val action = ApiFragmentDirections.actionApiFragmentToApiDetailFragment(comment?.id as Int)
  44. v.findNavController().navigate(action)
  45. }
  46. }
  47.  
  48.  
  49. // ApiFragment esim:
  50.  
  51. class ApiDetailFragment : Fragment() {
  52. // change this to match your fragment name
  53. private var _binding: FragmentApiDetailBinding? = null
  54.  
  55. // This property is only valid between onCreateView and
  56. // onDestroyView.
  57. private val binding get() = _binding!!
  58.  
  59. val args: ApiDetailFragmentArgs by navArgs()
  60.  
  61. override fun onCreateView(
  62. inflater: LayoutInflater,
  63. container: ViewGroup?,
  64. savedInstanceState: Bundle?
  65. ): View? {
  66. _binding = FragmentApiDetailBinding.inflate(inflater, container, false)
  67. val root: View = binding.root
  68.  
  69. Log.d("TESTI", "PARAMETRI: " + args.id.toString())
  70.  
  71. val JSON_URL = "https://jsonplaceholder.typicode.com/comments/" + args.id.toString()
  72.  
  73. // vaihtoehtoja, miten hakea yksittäisen kommentin kaikki tiedot käyttöliittymään
  74.  
  75. // vaihtoehto 1: otetaan parametrina pelkkä id, käytetään volleyta ja gsonia ja haetaan yksi kommentti rajapinnasta
  76.  
  77. // vaihtoehto 2: laitetaan ApiDetailFragmentille useampi parametri, jossa on muut tiedot kommentista
  78. // huono puoli: jos data on muuttunut rajapinnassa välissä -> tällä tavalla tiedot voivat olla vanhoja
  79.  
  80. // vaihtoehto 3: otetaan vain yksi parametria, joka on tekstimuuttuja. muutetaan kaikki kommentin tiedot JSONiksi
  81. // GSONin avulla, ja siirretään se parametrina ApiDetailFragmentille, jossa se taas puretaan GSONilla. sama ongelma myös
  82. // data saattaa olla vanhentunut
  83.  
  84. // the binding -object allows you to access views in the layout, textviews etc.
  85.  
  86.  
  87. return root
  88. }
  89.  
  90. override fun onDestroyView() {
  91. super.onDestroyView()
  92. _binding = null
  93. }
  94. }
  95.  
  96. ----------------------------------------
  97. ---------------------------------------
  98.  
  99.  
  100. // MapsFragment, mutta binding layerilla
  101. class MapsFragment : Fragment() {
  102.  
  103. // change this to match your fragment name
  104. private var _binding: FragmentMapsBinding? = null
  105.  
  106. // This property is only valid between onCreateView and
  107. // onDestroyView.
  108. private val binding get() = _binding!!
  109.  
  110. override fun onCreateView(
  111. inflater: LayoutInflater,
  112. container: ViewGroup?,
  113. savedInstanceState: Bundle?
  114. ): View? {
  115. _binding = FragmentMapsBinding.inflate(inflater, container, false)
  116. val root: View = binding.root
  117.  
  118. // the binding -object allows you to access views in the layout, textviews etc.
  119.  
  120. return root
  121. }
  122.  
  123. private val callback = OnMapReadyCallback { googleMap ->
  124.  
  125. val sydney = LatLng(-34.0, 151.0)
  126. googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  127. // googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
  128.  
  129. val rovaniemi = LatLng(66.50319436087507, 25.726910828015637)
  130. googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi"))
  131. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 16f))
  132.  
  133.  
  134. }
  135.  
  136. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  137. super.onViewCreated(view, savedInstanceState)
  138. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  139. mapFragment?.getMapAsync(callback)
  140. }
  141. }
  142.  
  143.  
  144. // jotta voimme laittaa myös omia Viewejä Google Mapsin lisäksi, muutetaan MapsFragmentin ulkoasu tähän formaattiin:
  145.  
  146. <?xml version="1.0" encoding="utf-8"?>
  147. <androidx.constraintlayout.widget.ConstraintLayout
  148. xmlns:android="http://schemas.android.com/apk/res/android"
  149. xmlns:tools="http://schemas.android.com/tools"
  150. tools:context=".MapsFragment"
  151. android:layout_width="match_parent"
  152. android:layout_height="match_parent">
  153.  
  154. <fragment
  155. android:id="@+id/map"
  156. android:name="com.google.android.gms.maps.SupportMapFragment"
  157. android:layout_width="match_parent"
  158. android:layout_height="match_parent"
  159. />
  160.  
  161. </androidx.constraintlayout.widget.ConstraintLayout>
  162.  
  163.  
  164. // CheckBox ja RadioButtonit
  165. // muista asettaa FloatingActionButton "app_bar_main.xml" -tiedostossa tilaan:
  166. // android:visibility="invisible" jotta se ei mene zoom-painikkeiden päälle
  167.  
  168. // mapsfragmentin ulkoasu:
  169. <?xml version="1.0" encoding="utf-8"?>
  170. <androidx.constraintlayout.widget.ConstraintLayout
  171. xmlns:android="http://schemas.android.com/apk/res/android"
  172. xmlns:app="http://schemas.android.com/apk/res-auto"
  173. xmlns:tools="http://schemas.android.com/tools"
  174. tools:context=".MapsFragment"
  175. android:layout_width="match_parent"
  176. android:layout_height="match_parent">
  177.  
  178. <androidx.fragment.app.FragmentContainerView
  179. android:id="@+id/map"
  180. android:name="com.google.android.gms.maps.SupportMapFragment"
  181. android:layout_width="match_parent"
  182. android:layout_height="match_parent"
  183. app:layout_constraintBottom_toBottomOf="parent"
  184. app:layout_constraintEnd_toEndOf="parent"
  185. app:layout_constraintStart_toStartOf="parent"
  186. app:layout_constraintTop_toTopOf="parent" />
  187.  
  188. <CheckBox
  189. android:id="@+id/checkBox_zoom"
  190. android:layout_width="wrap_content"
  191. android:layout_height="wrap_content"
  192. android:text="Zoom"
  193. app:layout_constraintStart_toStartOf="parent"
  194. app:layout_constraintTop_toTopOf="parent" />
  195.  
  196. <RadioGroup
  197. android:layout_width="wrap_content"
  198. android:layout_height="wrap_content"
  199. android:layout_margin="10dp"
  200. app:layout_constraintEnd_toEndOf="parent"
  201. app:layout_constraintTop_toTopOf="parent">
  202.  
  203. <RadioButton
  204. android:id="@+id/radioButton_normal"
  205. android:layout_width="match_parent"
  206. android:layout_height="wrap_content"
  207. android:checked="true"
  208. android:text="Normal" />
  209.  
  210. <RadioButton
  211. android:id="@+id/radioButton_hybrid"
  212. android:layout_width="match_parent"
  213. android:layout_height="wrap_content"
  214. android:text="Hybrid" />
  215. </RadioGroup>
  216.  
  217. </androidx.constraintlayout.widget.ConstraintLayout>
  218.  
  219.  
  220. // MapsFragment:
  221. class MapsFragment : Fragment() {
  222.  
  223. // change this to match your fragment name
  224. private var _binding: FragmentMapsBinding? = null
  225.  
  226. // This property is only valid between onCreateView and
  227. // onDestroyView.
  228. private val binding get() = _binding!!
  229.  
  230. override fun onCreateView(
  231. inflater: LayoutInflater,
  232. container: ViewGroup?,
  233. savedInstanceState: Bundle?
  234. ): View? {
  235. _binding = FragmentMapsBinding.inflate(inflater, container, false)
  236. val root: View = binding.root
  237.  
  238. // asetetaan zoom-kontrollit näkyviin tai piiloon riippuen valinnasta
  239. binding.checkBoxZoom.setOnCheckedChangeListener { compoundButton, b ->
  240. gMap.uiSettings.isZoomControlsEnabled = compoundButton.isChecked
  241. }
  242.  
  243. // vaihdetaan kartantyyppi, jos valittuna normaali kartta
  244. binding.radioButtonNormal.setOnCheckedChangeListener { compoundButton, b ->
  245. if(compoundButton.isChecked) {
  246. gMap.mapType = GoogleMap.MAP_TYPE_NORMAL
  247. }
  248. }
  249.  
  250. // vaihdetaan kartantyyppi, jos valittuna hybrid-kartta
  251. binding.radioButtonHybrid.setOnCheckedChangeListener { compoundButton, b ->
  252. if(compoundButton.isChecked) {
  253. gMap.mapType = GoogleMap.MAP_TYPE_HYBRID
  254. }
  255. }
  256.  
  257. return root
  258. }
  259.  
  260. // jotta päästään googleMap -olioon käsiksi myös muualta, tallennetaan se
  261. // OnMapReadyCallBackissa tähän
  262. private lateinit var gMap : GoogleMap
  263.  
  264. private val callback = OnMapReadyCallback { googleMap ->
  265.  
  266. gMap = googleMap
  267.  
  268. val sydney = LatLng(-34.0, 151.0)
  269. googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  270. // googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
  271.  
  272. val rovaniemi = LatLng(66.50319436087507, 25.726910828015637)
  273. googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi"))
  274. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 16f))
  275.  
  276.  
  277. }
  278.  
  279. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  280. super.onViewCreated(view, savedInstanceState)
  281. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  282. mapFragment?.getMapAsync(callback)
  283. }
  284. }
  285.  
  286.  
  287. // MapsFragment, Markerien klikkaaminen
  288.  
  289. // GoogleMap.OnMarkerClickListenerin avulla voimme reagoida kun markeria klikataan
  290. class MapsFragment : Fragment(), GoogleMap.OnMarkerClickListener {
  291.  
  292. // change this to match your fragment name
  293. private var _binding: FragmentMapsBinding? = null
  294.  
  295. // This property is only valid between onCreateView and
  296. // onDestroyView.
  297. private val binding get() = _binding!!
  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. // asetetaan zoom-kontrollit näkyviin tai piiloon riippuen valinnasta
  308. binding.checkBoxZoom.setOnCheckedChangeListener { compoundButton, b ->
  309. gMap.uiSettings.isZoomControlsEnabled = compoundButton.isChecked
  310. }
  311.  
  312. // vaihdetaan kartantyyppi, jos valittuna normaali kartta
  313. binding.radioButtonNormal.setOnCheckedChangeListener { compoundButton, b ->
  314. if(compoundButton.isChecked) {
  315. gMap.mapType = GoogleMap.MAP_TYPE_NORMAL
  316. }
  317. }
  318.  
  319. // vaihdetaan kartantyyppi, jos valittuna hybrid-kartta
  320. binding.radioButtonHybrid.setOnCheckedChangeListener { compoundButton, b ->
  321. if(compoundButton.isChecked) {
  322. gMap.mapType = GoogleMap.MAP_TYPE_HYBRID
  323. }
  324. }
  325.  
  326. return root
  327. }
  328.  
  329. // jotta päästään googleMap -olioon käsiksi myös muualta, tallennetaan se
  330. // OnMapReadyCallBackissa tähän
  331. private lateinit var gMap : GoogleMap
  332.  
  333. private val callback = OnMapReadyCallback { googleMap ->
  334.  
  335. gMap = googleMap
  336.  
  337. // kaksi markeria: Sydney ja Rovaniemi
  338. // tagin avulla markeriin (tai mihin vain Viewiin) voi liittää dataa mukaan
  339. // esim. numeron, tekstiä, .... tai JSONia
  340.  
  341. val sydney = LatLng(-34.0, 151.0)
  342. var marker1 : Marker? = googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
  343. marker1?.tag = "Sydney"
  344.  
  345. val rovaniemi = LatLng(66.50319436087507, 25.726910828015637)
  346. var marker2 : Marker? = googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi"))
  347. marker2?.tag = "Rovaniemi"
  348.  
  349. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 16f))
  350.  
  351. // asetetaan, että MapsFragmentin sisällä olevat OnMarkerClick huolehtii
  352. // markerien klikkauksesta
  353. googleMap.setOnMarkerClickListener(this)
  354. }
  355.  
  356. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  357. super.onViewCreated(view, savedInstanceState)
  358. val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
  359. mapFragment?.getMapAsync(callback)
  360. }
  361.  
  362. // kun markeria klikataan, ajetaan tämä funktio:
  363. override fun onMarkerClick(p0: Marker): Boolean {
  364. Log.d("ADVTECH", "MARKKERI")
  365.  
  366. // markerin koordinaatit
  367. var coordinates : LatLng = p0.position
  368. Log.d("ADVTECH", coordinates.latitude.toString() + " - " + coordinates.longitude.toString())
  369.  
  370. // markerin mukana tullut lisätieto (tässä tapauksessa kaupungin nimi)
  371. var city = p0.tag.toString()
  372. Log.d("ADVTECH", city)
  373.  
  374. return false
  375. }
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement