Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Edistynyt mobiiliohjelmointi 1.2.2023
- class CommentHolder(v: RecyclerviewItemRowBinding) : RecyclerView.ViewHolder(v.root), View.OnClickListener {
- // view => binding layer
- // comment => yksittäinen comment-data
- private var view: RecyclerviewItemRowBinding = v
- private var comment: Comment? = null
- // v.root tarvitaan siksi, koska v on tässä tapauksessa binding layer, ei View
- // v.root on binding layerin pohjimmainen View, eli ulkoasu
- init {
- v.root.setOnClickListener(this)
- }
- // tätä fuktiota kutsutaan jokaisen comment-datan kohdalla
- // kun se asetetaan listaan
- // toisin sanoen, tässä funktiossa päätetään mikä muuttuja
- // kytketään mihinkiin Viewiin, esim. TextViewiin
- fun bindComment(comment: Comment)
- {
- // laitetaan Comment -olio talteen, jotta pääsemme
- // siihen helpommin käsiksi esim. onClickissä
- this.comment = comment
- // jos commentin nimi on liian pitkä, lyhennetään
- var commentName = comment.name as String
- if(commentName.length > 20)
- {
- commentName = commentName.substring(0, 20) + "..."
- }
- view.textViewCommentName.text = commentName
- view.textViewCommentContent.text = comment.body
- view.textViewCommentEmail.text = comment.email
- }
- // ApiDetailFragment on uusi fragment, identtinen DataDetailFragmentin kanssa (paitsi nimet)
- override fun onClick(v: View) {
- // huom: comment.id on Int? eli "nullable" Int, minkä vuoksi meidän pitää muuntaa se vielä Int-muotoon
- val action = ApiFragmentDirections.actionApiFragmentToApiDetailFragment(comment?.id as Int)
- v.findNavController().navigate(action)
- }
- }
- // ApiFragment esim:
- class ApiDetailFragment : Fragment() {
- // change this to match your fragment name
- private var _binding: FragmentApiDetailBinding? = null
- // This property is only valid between onCreateView and
- // onDestroyView.
- private val binding get() = _binding!!
- val args: ApiDetailFragmentArgs by navArgs()
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentApiDetailBinding.inflate(inflater, container, false)
- val root: View = binding.root
- Log.d("TESTI", "PARAMETRI: " + args.id.toString())
- val JSON_URL = "https://jsonplaceholder.typicode.com/comments/" + args.id.toString()
- // vaihtoehtoja, miten hakea yksittäisen kommentin kaikki tiedot käyttöliittymään
- // vaihtoehto 1: otetaan parametrina pelkkä id, käytetään volleyta ja gsonia ja haetaan yksi kommentti rajapinnasta
- // vaihtoehto 2: laitetaan ApiDetailFragmentille useampi parametri, jossa on muut tiedot kommentista
- // huono puoli: jos data on muuttunut rajapinnassa välissä -> tällä tavalla tiedot voivat olla vanhoja
- // vaihtoehto 3: otetaan vain yksi parametria, joka on tekstimuuttuja. muutetaan kaikki kommentin tiedot JSONiksi
- // GSONin avulla, ja siirretään se parametrina ApiDetailFragmentille, jossa se taas puretaan GSONilla. sama ongelma myös
- // data saattaa olla vanhentunut
- // the binding -object allows you to access views in the layout, textviews etc.
- return root
- }
- override fun onDestroyView() {
- super.onDestroyView()
- _binding = null
- }
- }
- ----------------------------------------
- ---------------------------------------
- // MapsFragment, mutta binding layerilla
- class MapsFragment : Fragment() {
- // change this to match your fragment name
- private var _binding: FragmentMapsBinding? = null
- // This property is only valid between onCreateView and
- // onDestroyView.
- private val binding get() = _binding!!
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentMapsBinding.inflate(inflater, container, false)
- val root: View = binding.root
- // the binding -object allows you to access views in the layout, textviews etc.
- return root
- }
- private val callback = OnMapReadyCallback { googleMap ->
- val sydney = LatLng(-34.0, 151.0)
- googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
- // googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
- val rovaniemi = LatLng(66.50319436087507, 25.726910828015637)
- googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi"))
- googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 16f))
- }
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
- mapFragment?.getMapAsync(callback)
- }
- }
- // jotta voimme laittaa myös omia Viewejä Google Mapsin lisäksi, muutetaan MapsFragmentin ulkoasu tähän formaattiin:
- <?xml version="1.0" encoding="utf-8"?>
- <androidx.constraintlayout.widget.ConstraintLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- tools:context=".MapsFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <fragment
- android:id="@+id/map"
- android:name="com.google.android.gms.maps.SupportMapFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
- </androidx.constraintlayout.widget.ConstraintLayout>
- // CheckBox ja RadioButtonit
- // muista asettaa FloatingActionButton "app_bar_main.xml" -tiedostossa tilaan:
- // android:visibility="invisible" jotta se ei mene zoom-painikkeiden päälle
- // mapsfragmentin ulkoasu:
- <?xml version="1.0" encoding="utf-8"?>
- <androidx.constraintlayout.widget.ConstraintLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- tools:context=".MapsFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <androidx.fragment.app.FragmentContainerView
- android:id="@+id/map"
- android:name="com.google.android.gms.maps.SupportMapFragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
- <CheckBox
- android:id="@+id/checkBox_zoom"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Zoom"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
- <RadioGroup
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="10dp"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintTop_toTopOf="parent">
- <RadioButton
- android:id="@+id/radioButton_normal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:checked="true"
- android:text="Normal" />
- <RadioButton
- android:id="@+id/radioButton_hybrid"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Hybrid" />
- </RadioGroup>
- </androidx.constraintlayout.widget.ConstraintLayout>
- // MapsFragment:
- class MapsFragment : Fragment() {
- // change this to match your fragment name
- private var _binding: FragmentMapsBinding? = null
- // This property is only valid between onCreateView and
- // onDestroyView.
- private val binding get() = _binding!!
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentMapsBinding.inflate(inflater, container, false)
- val root: View = binding.root
- // asetetaan zoom-kontrollit näkyviin tai piiloon riippuen valinnasta
- binding.checkBoxZoom.setOnCheckedChangeListener { compoundButton, b ->
- gMap.uiSettings.isZoomControlsEnabled = compoundButton.isChecked
- }
- // vaihdetaan kartantyyppi, jos valittuna normaali kartta
- binding.radioButtonNormal.setOnCheckedChangeListener { compoundButton, b ->
- if(compoundButton.isChecked) {
- gMap.mapType = GoogleMap.MAP_TYPE_NORMAL
- }
- }
- // vaihdetaan kartantyyppi, jos valittuna hybrid-kartta
- binding.radioButtonHybrid.setOnCheckedChangeListener { compoundButton, b ->
- if(compoundButton.isChecked) {
- gMap.mapType = GoogleMap.MAP_TYPE_HYBRID
- }
- }
- return root
- }
- // jotta päästään googleMap -olioon käsiksi myös muualta, tallennetaan se
- // OnMapReadyCallBackissa tähän
- private lateinit var gMap : GoogleMap
- private val callback = OnMapReadyCallback { googleMap ->
- gMap = googleMap
- val sydney = LatLng(-34.0, 151.0)
- googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
- // googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
- val rovaniemi = LatLng(66.50319436087507, 25.726910828015637)
- googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi"))
- googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 16f))
- }
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
- mapFragment?.getMapAsync(callback)
- }
- }
- // MapsFragment, Markerien klikkaaminen
- // GoogleMap.OnMarkerClickListenerin avulla voimme reagoida kun markeria klikataan
- class MapsFragment : Fragment(), GoogleMap.OnMarkerClickListener {
- // change this to match your fragment name
- private var _binding: FragmentMapsBinding? = null
- // This property is only valid between onCreateView and
- // onDestroyView.
- private val binding get() = _binding!!
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- _binding = FragmentMapsBinding.inflate(inflater, container, false)
- val root: View = binding.root
- // asetetaan zoom-kontrollit näkyviin tai piiloon riippuen valinnasta
- binding.checkBoxZoom.setOnCheckedChangeListener { compoundButton, b ->
- gMap.uiSettings.isZoomControlsEnabled = compoundButton.isChecked
- }
- // vaihdetaan kartantyyppi, jos valittuna normaali kartta
- binding.radioButtonNormal.setOnCheckedChangeListener { compoundButton, b ->
- if(compoundButton.isChecked) {
- gMap.mapType = GoogleMap.MAP_TYPE_NORMAL
- }
- }
- // vaihdetaan kartantyyppi, jos valittuna hybrid-kartta
- binding.radioButtonHybrid.setOnCheckedChangeListener { compoundButton, b ->
- if(compoundButton.isChecked) {
- gMap.mapType = GoogleMap.MAP_TYPE_HYBRID
- }
- }
- return root
- }
- // jotta päästään googleMap -olioon käsiksi myös muualta, tallennetaan se
- // OnMapReadyCallBackissa tähän
- private lateinit var gMap : GoogleMap
- private val callback = OnMapReadyCallback { googleMap ->
- gMap = googleMap
- // kaksi markeria: Sydney ja Rovaniemi
- // tagin avulla markeriin (tai mihin vain Viewiin) voi liittää dataa mukaan
- // esim. numeron, tekstiä, .... tai JSONia
- val sydney = LatLng(-34.0, 151.0)
- var marker1 : Marker? = googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
- marker1?.tag = "Sydney"
- val rovaniemi = LatLng(66.50319436087507, 25.726910828015637)
- var marker2 : Marker? = googleMap.addMarker(MarkerOptions().position(rovaniemi).title("Rovaniemi"))
- marker2?.tag = "Rovaniemi"
- googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(rovaniemi, 16f))
- // asetetaan, että MapsFragmentin sisällä olevat OnMarkerClick huolehtii
- // markerien klikkauksesta
- googleMap.setOnMarkerClickListener(this)
- }
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
- mapFragment?.getMapAsync(callback)
- }
- // kun markeria klikataan, ajetaan tämä funktio:
- override fun onMarkerClick(p0: Marker): Boolean {
- Log.d("ADVTECH", "MARKKERI")
- // markerin koordinaatit
- var coordinates : LatLng = p0.position
- Log.d("ADVTECH", coordinates.latitude.toString() + " - " + coordinates.longitude.toString())
- // markerin mukana tullut lisätieto (tässä tapauksessa kaupungin nimi)
- var city = p0.tag.toString()
- Log.d("ADVTECH", city)
- return false
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement