Advertisement
tuomasvaltanen

Untitled

May 10th, 2023 (edited)
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.50 KB | None | 0 0
  1. // Edistynyt mobiiliohjelmointi, 10.5.2023
  2.  
  3. // lokalisointi
  4.  
  5. Android Studio vasen ylänurkka -> Vaihda Android-näkymä Project-näkymäksi
  6.  
  7. Tehdään app -> src -> main -> res-kansioon kaksi uutta kansiota:
  8.  
  9. values-en
  10. values-fi
  11.  
  12. Kopioidaan values-kansion strings.xml kumpaankin kansioon pohjaksi. Tämän jälkeen voit avata minkä vain strings.xml-tiedoston, ja klikata oikeasta ylänurkasta "Open editor".
  13.  
  14. Jos editori sekoilee, Clean project -> Rebuild project.
  15.  
  16. Tehdään uusi käännös nimeltä "greeting_text", arvoiksi:
  17.  
  18. Default: Welcome!
  19. English: Welcome!
  20. Finnish: Tervetuloa!
  21.  
  22. Kokeillaan käyttää tätä arvoa esim. fragment homessa:
  23.  
  24. <TextView
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:layout_margin="20dp"
  28. android:text="@string/greeting_text"
  29. android:textSize="32sp"
  30. android:textStyle="bold"
  31. app:layout_constraintEnd_toEndOf="parent"
  32. app:layout_constraintStart_toStartOf="parent"
  33. app:layout_constraintTop_toTopOf="parent" />
  34.  
  35.  
  36. Nyt jos emulaattorissa vaihtaa asetuksista kielen suomeksi, vaihtuu myös tervetuloteksti ulkoasussa.
  37.  
  38. // tehdään myös uusi kansio res-kansioon -> layout-sw720dp , ja kopioidaan sinne fragment_home.xml.
  39. // idea on se että tehdään tästä fragmentista oma versio isoille tableteille (yli 10" näyttö)
  40.  
  41. // tehdään tabletin ulkoasuun isompi teksti, kursivoituna ja eri värisenä:
  42.  
  43. <TextView
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"
  46. android:layout_margin="20dp"
  47. android:text="@string/greeting_text"
  48. android:textColor="#2BAABA"
  49. android:textSize="140sp"
  50. android:textStyle="bold|italic"
  51. app:layout_constraintEnd_toEndOf="parent"
  52. app:layout_constraintStart_toStartOf="parent"
  53. app:layout_constraintTop_toTopOf="parent" />
  54.  
  55.  
  56. #######################################
  57. AA CHART KOTLIN -testailua
  58. #######################################
  59.  
  60. https://github.com/AAChartModel/AAChartCore-Kotlin
  61.  
  62. jitpack pitää löyty settings.gradlesta (ks. viewien kustomointi -luentojen muistiinpanot)
  63.  
  64. Ohjeen mukaan import:
  65.  
  66. implementation 'com.github.AAChartModel:AAChartCore-Kotlin:-SNAPSHOT'
  67.  
  68. Ei näemmä toimi enää, kokeillaan:
  69.  
  70. implementation 'com.github.AAChartModel:AAChartCore-Kotlin:7.2.0'
  71.  
  72. Tehdään testaamista varten oma fragment, ChartFragment, lisätään päävalikkoon ja otetaan binding layer käyttöön:
  73.  
  74. class ChartFragment : Fragment() {
  75. private var _binding: FragmentChartBinding? = null
  76. // This property is only valid between onCreateView and
  77. // onDestroyView.
  78. private val binding get() = _binding!!
  79. override fun onCreateView(
  80. inflater: LayoutInflater,
  81. container: ViewGroup?,
  82. savedInstanceState: Bundle?
  83. ): View? {
  84. _binding = FragmentChartBinding.inflate(inflater, container, false)
  85. val root: View = binding.root
  86.  
  87.  
  88.  
  89. return root
  90. }
  91. override fun onDestroyView() {
  92. super.onDestroyView()
  93. _binding = null
  94. }
  95. }
  96.  
  97. // lisätään chart view ulkoasuun:
  98.  
  99. <?xml version="1.0" encoding="utf-8"?>
  100. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  101. xmlns:tools="http://schemas.android.com/tools"
  102. android:layout_width="match_parent"
  103. android:layout_height="match_parent"
  104. tools:context=".ChartFragment">
  105.  
  106. <com.github.aachartmodel.aainfographics.aachartcreator.AAChartView
  107. android:id="@+id/aa_chart_view"
  108. android:layout_width="match_parent"
  109. android:layout_height="match_parent">
  110.  
  111. </com.github.aachartmodel.aainfographics.aachartcreator.AAChartView>
  112.  
  113. </FrameLayout>
  114.  
  115. // tämän jälkeen, kokeillaan GitHubissa olevaa esimerkkiä:
  116.  
  117. override fun onCreateView(
  118. inflater: LayoutInflater,
  119. container: ViewGroup?,
  120. savedInstanceState: Bundle?
  121. ): View? {
  122. _binding = FragmentChartBinding.inflate(inflater, container, false)
  123. val root: View = binding.root
  124.  
  125. val aaChartModel : AAChartModel = AAChartModel()
  126. .chartType(AAChartType.Area)
  127. .title("title")
  128. .subtitle("subtitle")
  129. .dataLabelsEnabled(true)
  130. .series(arrayOf(
  131. AASeriesElement()
  132. .name("Tokyo")
  133. .data(arrayOf(7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6)),
  134. AASeriesElement()
  135. .name("NewYork")
  136. .data(arrayOf(0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5)),
  137. AASeriesElement()
  138. .name("London")
  139. .data(arrayOf(0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0)),
  140. AASeriesElement()
  141. .name("Berlin")
  142. .data(arrayOf(3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8))
  143. )
  144. )
  145.  
  146. //The chart view object calls the instance object of AAChartModel and draws the final graphic
  147. binding.aaChartView.aa_drawChartWithChartModel(aaChartModel)
  148.  
  149. return root
  150. }
  151.  
  152. // kokeillaan erillisellä datalistalla, jota voi myöhemmin päivittää MQTT:llä
  153.  
  154. // tehdään lista, johon kerrytettään lämpötilat talteen
  155. val temperatureList = mutableListOf<Double>()
  156.  
  157. override fun onCreateView(
  158. inflater: LayoutInflater,
  159. container: ViewGroup?,
  160. savedInstanceState: Bundle?
  161. ): View? {
  162. _binding = FragmentChartBinding.inflate(inflater, container, false)
  163. val root: View = binding.root
  164.  
  165. // laitetaan muutama testiarvo että nähdään toimiiko AAChart oletetusti tällä listalla
  166. temperatureList.add(12.5)
  167. temperatureList.add(9.7)
  168. temperatureList.add(15.1)
  169.  
  170. // temperatureListin saa AAChartille sopivaan formaattiin kun käyttää toTypedArray()-funktiota
  171. // toimii vain jos temperatureList on tyyppiä mutable list -> Double
  172. val aaChartModel : AAChartModel = AAChartModel()
  173. .chartType(AAChartType.Line)
  174. .title("Sääasema")
  175. .subtitle("Rantavitikan mittauspiste")
  176. .dataLabelsEnabled(true)
  177. .series(arrayOf(
  178. AASeriesElement()
  179. .name("Lämpötila")
  180. .data(temperatureList.toTypedArray())
  181. )
  182. )
  183.  
  184. //The chart view object calls the instance object of AAChartModel and draws the final graphic
  185. binding.aaChartView.aa_drawChartWithChartModel(aaChartModel)
  186.  
  187. return root
  188. }
  189.  
  190. // jos haluat asettaa y-akselille ylä- ja ala-arvon:
  191.  
  192. // temperatureListin saa AAChartille sopivaan formaattiin kun käyttää toTypedArray()-funktiota
  193. // toimii vain jos temperatureList on tyyppiä mutable list -> Double
  194. val aaChartModel : AAChartModel = AAChartModel()
  195. .chartType(AAChartType.Line)
  196. .title("Sääasema")
  197. .subtitle("Rantavitikan mittauspiste")
  198. .dataLabelsEnabled(true)
  199. .yAxisMin(-50)
  200. .yAxisMax(50)
  201. .series(arrayOf(
  202. AASeriesElement()
  203. .name("Lämpötila")
  204. .data(temperatureList.toTypedArray())
  205. )
  206. )
  207.  
  208.  
  209. // zoomauksen saa lisättyä chart modeliin esim näin:
  210.  
  211. .zoomType(AAChartZoomType.Y)
  212.  
  213.  
  214. // jos kytketään AAChart MQTT-dataan, voidaan tehdä näin:
  215.  
  216. try {
  217. // muutetaan vastaanotettu data JSONista -> WeatherStation -luokan olioksi
  218. var item : WeatherStation = gson.fromJson(result, WeatherStation::class.java)
  219. Log.d("ADVTECH", item.d.get1().v.toString() + "C")
  220.  
  221. // asetetaan tekstimuuttuja käyttöliittymään, jossa on säätietoja
  222. val temperature = item.d.get1().v
  223. var humidity = item.d.get3().v
  224.  
  225. // pidetään huoli että listan max-koko on 10 lämpötilaa
  226. while(temperatureList.size >= 10) {
  227. temperatureList.removeAt(0)
  228. }
  229.  
  230. // lisätään uusi lämpötila listaan
  231. temperatureList.add(temperature)
  232.  
  233. // tehdään chartin data uusiksi listan pohjalta
  234. var newArray = arrayOf(
  235. AASeriesElement()
  236. .name("Lämpötila")
  237. .data(temperatureList.toTypedArray())
  238. )
  239.  
  240. // koska MQTT-plugin ajaa koodia ja käsittelee dataa
  241. // tausta-ajolla omassa säikeessään eli threadissa
  242. // joudumme laittamaan ulkoasuun liittyvän koodin runOnUiThread-blokin
  243. // sisälle. Muutoin tulee virhe että koodit toimivat eri säikeissä.
  244. activity?.runOnUiThread {
  245. // dokumentaatio on nähtävästi tämän osalta vanhentunut
  246. // aaChartView.aa_onlyRefreshTheChartDataWithChartModelSeries(chartModelSeriesArray)
  247. binding.aaChartView.aa_onlyRefreshTheChartDataWithChartOptionsSeriesArray(newArray, false)
  248. }
  249.  
  250. }
  251. catch(e : Exception) {
  252. Log.d("ADVTECH", e.message.toString())
  253. Log.d("ADVTECH", "Saattaa olla diagnostiikkadataa.")
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement