bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


android

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
android [2023/01/10 16:14]
enric_mieza_sanchez
android [2025/09/29 15:31] (actual)
enric_mieza_sanchez [Rècords "Hall Of Fame"]
Línia 21: Línia 21:
 Hi ha diverses opcions per desenvolupar per a Android, fem un breu resum de les més habituals: Hi ha diverses opcions per desenvolupar per a Android, fem un breu resum de les més habituals:
  
-  * **Java** sol ser la opció més comuna per desenvolupar apps per a Android. Es compilen sobre un processador virtual corresponent a la JVM (Java Virtual Machine). És el que s'anomena [[https://es.wikipedia.org/wiki/Android_Runtime|Android Runtime]].+  * **[[Kotlin]]** és la opció oficial d'Android actualment. És un llenguatge recent que compila sobre //bytecode// Dalvik d'Android i que millora certs aspectes de Java. S'ha creat per al desenvolupament d'apps Android però també amb la voluntat d'estendre's a d'altres àmbits com aplicacions d'escriptori. 
 +  * **Java** era la opció original més antiga (i oficial) per a desenvolupament d'apps per a Android. Es compilen sobre un processador virtual corresponent a la JVM (Java Virtual Machine). És el que s'anomena [[https://es.wikipedia.org/wiki/Android_Runtime|Android Runtime]].
     * [[https://stackoverflow.com/questions/9231821/dalviks-effect-on-native-c-code-performance|Es perd eficiència pel fet que Java no sigui codi nadiu?]]     * [[https://stackoverflow.com/questions/9231821/dalviks-effect-on-native-c-code-performance|Es perd eficiència pel fet que Java no sigui codi nadiu?]]
     * Llegeix [[Java]] per detalls d'instal·lació i //setup// del JDK.     * Llegeix [[Java]] per detalls d'instal·lació i //setup// del JDK.
Línia 37: Línia 38:
   * **Xamarin** permet treballar en C# i compilar de forma multiplataforma per a Android i iOS   * **Xamarin** permet treballar en C# i compilar de forma multiplataforma per a Android i iOS
  
 +Android Studio i les àrees de treball:
 +
 +{{:android-studio-1.png?direct|}}
  
 ==== Alguns aspectes inicials ==== ==== Alguns aspectes inicials ====
Línia 82: Línia 86:
   - Mira els apartats de més amunt i l'article [[Java]] per disposar de la instal·lació del IDE i llibreries adequades.   - Mira els apartats de més amunt i l'article [[Java]] per disposar de la instal·lació del IDE i llibreries adequades.
   - Es recomana utilitzar algun tipus de sistema de control de versions. El més popular és [[Git]] i la web www.github.com . Es pot fer les operacions més comunes al menú VCS de IntelliJ IDEA.   - Es recomana utilitzar algun tipus de sistema de control de versions. El més popular és [[Git]] i la web www.github.com . Es pot fer les operacions més comunes al menú VCS de IntelliJ IDEA.
-  - Si ja has llegit els apunts per aclarir els conceptes previs, podem passar a l'acció. Crea una aplicació amb una //empty activity// des del menú File->New->Project->Android +  - Si ja has llegit els apunts per aclarir els conceptes previs, podem passar a l'acció. Crea una aplicació amb una //empty views activity// des del menú File->New->Project->Android 
-  - Afegeix un **botó** ([[https://developer.android.com/reference/android/widget/Button|Button]]). Busca els arxius de recursos **R.layout** (carpeta ''res->layout'' i arxiu ''activity_main.xml'') per afegir-ho gràficament (millor no complicar-nos la vida abans d'hora ;). +  - Afegeix un **botó** ([[https://developer.android.com/develop/ui/views/components/button?hl=es-419|Button]]). Busca els arxius de recursos **R.layout** (carpeta ''res->layout'' i arxiu ''activity_main.xml'') per afegir-ho gràficament (millor no complicar-nos la vida abans d'hora ;) 
-  - Afegeix un **OnButtonClickListener** al mètode ''onCreate'' de la ''MainActivity.java''. En principi, el botó no fa res quan el premem. Aquest //listener// ens permetrà captar l'event OnClick i fer alguna cosa. A la documentació del mateix [[https://developer.android.com/reference/android/widget/Button|Button]] trobaràs un exemple de com fer-ho.+  - Afegeix una //callback// al ''Button'' per respondre a l'event //OnButtonClick// dins el mètode ''onCreate'' de la ''MainActivity''. En principi, el botó no fa res quan el premem. Afegir una //callback// ens permetrà captar l'event //OnClick// i fer alguna cosa. A la documentació del mateix [[https://developer.android.com/develop/ui/views/components/button?hl=es-419|Button]] trobaràs un exemple de com fer-ho.
   - Afegeix un **Toast**. El primer que podem fer per comprovar que l'event //OnClick// s'està processant és construir un [[https://developer.android.com/guide/topics/ui/notifiers/toasts#java|Toast]], que son els missatges que apareixen en un globus temporalment sobre la app, a la part inferior de la pantalla habitualment. La manera més fàcil de crear-lo és amb ''Toast.makeText'', i després fer-li un ''show'' a l'objecte perquè es visualitzi.   - Afegeix un **Toast**. El primer que podem fer per comprovar que l'event //OnClick// s'està processant és construir un [[https://developer.android.com/guide/topics/ui/notifiers/toasts#java|Toast]], que son els missatges que apareixen en un globus temporalment sobre la app, a la part inferior de la pantalla habitualment. La manera més fàcil de crear-lo és amb ''Toast.makeText'', i després fer-li un ''show'' a l'objecte perquè es visualitzi.
 </WRAP> </WRAP>
Línia 95: Línia 99:
   - La app ens oferirà un casella d'entrada de text i un botó.   - La app ens oferirà un casella d'entrada de text i un botó.
   - La app crearà un número aleatori entre 1 i 100 que el jugador haurà d'endevinar.   - La app crearà un número aleatori entre 1 i 100 que el jugador haurà d'endevinar.
-  - Cada cop que l'usuari fa una temptativa es compta un nou intent.+  - Cada cop que l'usuari fa una temptativa
 +    * Se li comunica si el número que busca és més petit o més gran. 
 +    * Es compta un nou intent i es visualitzen en algun //widget//.
   - Quan l'usuari endevina del número que la app ha "pensat", s'acaba la partida.   - Quan l'usuari endevina del número que la app ha "pensat", s'acaba la partida.
 +  - La app torna a "pensar" un nou número aleatori i comença nova partida.
   - La puntuació resultant és el nombre d'intents que ha fet l'usuari fins a endevinar el número. Quan més petita és, millor.   - La puntuació resultant és el nombre d'intents que ha fet l'usuari fins a endevinar el número. Quan més petita és, millor.
   - La app demanarà el nom a l'usuari per posar-ho a la taula de rècords. L'usuari podrà posar el seu nom o desestimar-ho.   - La app demanarà el nom a l'usuari per posar-ho a la taula de rècords. L'usuari podrà posar el seu nom o desestimar-ho.
-  - La app torna a "pensar" un nou número aleatori i comença nova partida. 
  
 ==== Aplicació principal (joc) ==== ==== Aplicació principal (joc) ====
 <WRAP todo> <WRAP todo>
-  - Crea una nova aplicació amb una sola ''Activity'' (Empty Activity).+  - Crea una nova aplicació amb una sola ''Activity'' (Empty Views Activity).
   - Ves al layout i crea la casella d'entrada per al número. Es tracta d'un objecte ''TextEdit'', però volem restringir-ho perquè només ens deixi entrar nombres i no lletres. Entre els objectes disponibles al IDE hi ha un de predefinit que ja ens ho facilita.   - Ves al layout i crea la casella d'entrada per al número. Es tracta d'un objecte ''TextEdit'', però volem restringir-ho perquè només ens deixi entrar nombres i no lletres. Entre els objectes disponibles al IDE hi ha un de predefinit que ja ens ho facilita.
   - Crea un botó i un listener perquè l'usuari validi l'entrada del número. Prova que funciona amb un Toast, per exemple.   - Crea un botó i un listener perquè l'usuari validi l'entrada del número. Prova que funciona amb un Toast, per exemple.
Línia 110: Línia 116:
   - Afegeix un [[https://developer.android.com/guide/topics/ui/dialogs?hl=es-419|AlertDialog]] per avisar l'usuari de quan acaba la partida i felicitar-lo.   - Afegeix un [[https://developer.android.com/guide/topics/ui/dialogs?hl=es-419|AlertDialog]] per avisar l'usuari de quan acaba la partida i felicitar-lo.
   - Quan s'acaba la partida, es regenera el número aleatori i es torna a jugar.   - Quan s'acaba la partida, es regenera el número aleatori i es torna a jugar.
-  - Posa un quadre de text o ''TextView'' amb ''Scroll'' per tal de facilitar el seguiment de la partida per part de l'usuari (així veurà l'històric dels números que ha anat entrant.+  - Posa un ''TextView'' per anar indicant a l'usuari l'historial dels intents i resultats que ha obtingut. 
 +  - Per aconseguir un //scroll// en la pantalla de l'historial podem posar un ''ScrollView'' i a dins seu posar el ''TextView''
 +    * [[https://stackoverflow.com/questions/1748977/making-textview-scrollable-on-android|Exemple d'us de ScrollView]]. Funciona, però és un post antic, i els objectes han canviat, pel què el desplaçament fins el final està una mica confús. 
 +    * Com [[https://stackoverflow.com/questions/3080402/android-scrollview-force-to-bottom|desplaçar el ScrollView fins el final]]. Aquest post sí que està actualitzat.
   - Implementa un comptador d'intents que es visualitzi en algun racó de la pantalla. Ens servirà per després fer el //ranking//.   - Implementa un comptador d'intents que es visualitzi en algun racó de la pantalla. Ens servirà per després fer el //ranking//.
  
 Podem millorar la jugabilitat amb alguns detalls més. Podem millorar la jugabilitat amb alguns detalls més.
  
-  - Per facilitar el joc a l'usuari, esborrem el número del ''EditText'' que l'usuari fa un intent.+  - Per facilitar el joc a l'usuari, esborrem el número del ''EditText'' quan l'usuari fa un intent d'endevinar (si no, l'usuari haurà d'esborrar-ho manualment).
   - Es pot millorar la jugabilitat si implementem que **el joc detecti la tecla Enter** del teclat de pantalla.   - Es pot millorar la jugabilitat si implementem que **el joc detecti la tecla Enter** del teclat de pantalla.
     * S'implementa millor amb un [[https://stackoverflow.com/questions/25595414/stop-keyboard-from-closing-when-enter-is-pressed-in-edittext|OnEditorActionListener]] ja que el ''OnClickListener'' amaga el teclat al prèmer ENTER.     * S'implementa millor amb un [[https://stackoverflow.com/questions/25595414/stop-keyboard-from-closing-when-enter-is-pressed-in-edittext|OnEditorActionListener]] ja que el ''OnClickListener'' amaga el teclat al prèmer ENTER.
Línia 133: Línia 142:
  
 ==== Rècords "Hall Of Fame" ==== ==== Rècords "Hall Of Fame" ====
-Per a la taula de rècords crearem una nova ''Activity'' i la obrirem amb un objecte ''Intent''. L'objecte més adient per mostrar una llista de rècords seria una ''RecyclerView'' (la versió actualitzada de ''ListView'') però té força complexitat utilitzar-la. Farem 3 versions amb dificultat incremental per anar sofisticant la nostra app i anar veient els diferents recursos que podem emprar:+Per a la taula de rècords crearem una nova ''Activity'' i la obrirem amb un objecte ''Intent''. 
 + 
 +{{ :android:activity_intent.png?500 }} 
 + 
 + 
 +L'objecte més adient per mostrar una llista de rècords seria una ''RecyclerView'' (la versió actualitzada de ''ListView'') però té força complexitat utilitzar-la. Farem 3 versions amb dificultat incremental per anar sofisticant la nostra app i anar veient els diferents recursos que podem emprar:
   - Versió més simple amb una ''TextView''   - Versió més simple amb una ''TextView''
   - Versió millorada amb un ''TableLayout''   - Versió millorada amb un ''TableLayout''
Línia 140: Línia 154:
 Abans, però, caldrà crear una nova ''Activity'' per poder posar-hi el rànking: Abans, però, caldrà crear una nova ''Activity'' per poder posar-hi el rànking:
 <WRAP todo> <WRAP todo>
-  - Crear nova //Activity// amb el seu //layout// associat (arxiu XML): <code>File -> New -> Android Activity -> Empty Activity</code> +  - Crear nova //Activity// amb el seu //layout// associat (arxiu XML): <code>File -> New -> Android Activity -> Empty Views Activity</code> 
-  - Afegim [[https://stackoverflow.com/questions/9173347/android-setonkeylistener-on-edittext|Intent]]: aquest objecte ens serveix per posar en marxa una altra ''Activity''. Així podrem passar de la partida a la taula de rècords. Caldrà que l'activem quan acabem la partida, o bé podem afegir un botó nou per visualitzar la taula de rècords. [[https://developer.android.com/training/basics/firstapp/starting-activity?hl=es-419|Aquest exemple per obrir una nova activity t'ajudarà]].+    * ULL! Si creeu la ''Activity'' manualment, cal afegir-la també manualment a l'arxiu ''AndroidManifest.xml'' 
 +  - Afegim [[https://developer.android.com/guide/components/intents-filters?hl=es-419|Intent]]: aquest objecte ens serveix per posar en marxa una altra ''Activity''. Així podrem passar de la partida a la taula de rècords. Caldrà que l'activem quan acabem la partida, o bé podem afegir un botó nou per visualitzar la taula de rècords.
   - Per tal que puguem afegir una nova entrada a la taula de rècords caldrà que el ''MainActivity'' passi el paràmetre del nº d'intents que el jugador ha realitzat. Per passar paràmetres examina el mètode ''putExtra()'' de l'objecte ''Intent''.   - Per tal que puguem afegir una nova entrada a la taula de rècords caldrà que el ''MainActivity'' passi el paràmetre del nº d'intents que el jugador ha realitzat. Per passar paràmetres examina el mètode ''putExtra()'' de l'objecte ''Intent''.
   - Diàlegs o [[https://developer.android.com/guide/topics/ui/dialogs?hl=es-419|Dialogs]]: abans d'obrir la ''RecordsActivity'' convé que demanem a l'usuari si vol o no afegir el seu rècord a la taula. El //widget// Dialog ens permetrà fer això, i també demanar el nom de l'usuari. Tenim 2 estratègies diferents per implementar el ''Dialog'' que necessitem:   - Diàlegs o [[https://developer.android.com/guide/topics/ui/dialogs?hl=es-419|Dialogs]]: abans d'obrir la ''RecordsActivity'' convé que demanem a l'usuari si vol o no afegir el seu rècord a la taula. El //widget// Dialog ens permetrà fer això, i també demanar el nom de l'usuari. Tenim 2 estratègies diferents per implementar el ''Dialog'' que necessitem:
Línia 267: Línia 282:
  
 ===== Més coses interessants ===== ===== Més coses interessants =====
 +
 +\\
 +
 +==== Launcher Icons ====
 +Per personalitzar la icona que es veurà al //launcher// del dispositiu mòbil podeu [[https://stackoverflow.com/questions/43167057/libgdx-android-icon-not-being-applied|llegir aquest post sobre com canviar el launcher icon]].
 +
 +Podeu fer servir aquesta fantàstica eina: https://icon.kitchen
 +
 +\\
 +
 +==== Depuració Wireless ====
 +Seguiu aquest [[https://developer.android.com/tools/adb#wireless|article oficial de ADB per connectar-vos al vostre dispositiu mòbil via Wi-Fi]].
  
 \\ \\
Línia 314: Línia 341:
  
 ==== Text to Speech ==== ==== Text to Speech ====
-Una funció interessant per a les nostres apps és fer-la parlar. Per fer-ho, podeu gravar vosaltres els sons, però és molt interessant utilitzar el sintetitzador de veu d'Android, amb la llibreria Text-to-Speech. Així podem fer-li parlar qualsevol cosa, sense haver d'enregistrar abans. Val a dir que en els idiomes més parlats (anglès, castellà, francès, xinès) funciona molt bé, però en català el sintetitzador és de poca qualitat. 
  
-  - [[https://www.tutorialspoint.com/android/android_text_to_speech.htm|Tutorial per utilitzar Text-to-Speech en Android]]. +Pots mirar més sobre reconeixement i síntesi de veu a l'article [[Android Speech]].
-  - [[https://developer.android.com/reference/android/speech/tts/TextToSpeech|Documentació oficial de Text-to-Speech per a Android]]+
-  - Exemple [[https://stackoverflow.com/questions/3577058/android-tts-languages|per canviar de llengua (Locale)]] per a llengües que no estan als objectes principals.+
  
 \\ \\
android.1673367282.txt.gz · Darrera modificació: 2023/01/10 16:14 per enric_mieza_sanchez