Cerca con Google

Translate

21 marzo 2012

Tutorial 29 - Applicazioni MultiScreen (nuovo metodo) MIT App Inventor


Rieccoci con un nuovo VideoTutorial, come accennato precedentemente, la prima novità offerta da quando App Inventor è passato nelle mani del MIT è quella di realizzare applicazioni "realmente" MultiScreen.

Troviamo infatti ora due nuovi pulsanti sulla barra del design editor, "Add Screen" e "Remove Screen" che ci permettono in pratica di creare delle vere e proprie "sottoapplicazioni" all'interno della nostra app principale.
Vediamone brevemente le caratteristiche e le potenzialità.
Potremmo per esempio avere due schermate, una con l'applicazione vera e propria ed una con le impostazioni della nostra app.
Oppure come nella mia app Acqua Alta (di cui vorrei fare l'upgrade all'uso delle schermate multiple al più presto) avere uno screen diverso per ogni funzionalità dell'applicazione (dati marea,grafico,about,etc...)
I possibili utilizzi sono davvero infiniti, pensate alle app che usate tutti i giorni e vedrete che sono poche quelle composte da una sola schermata :)

La cosa più interessante è che finalmente il pulsante "back" del vostro telefono vi porterà allo screen precedente e non vi farà uscire dall'app (a meno che non siate allo screen iniziale).

Non sono tutte rose e fiori, spero che migliorino la gestione delle schermate multiple al più presto, ad oggi le limitazioni più fastidiose sono:
1-Impossibilità di testare l'app da blocks editor (bisogna infatti ogni volta fare "download to connected phone" da design editor per testare l'interazione tra schermate)
2-Impossibilità di avere componenti globali visibili all'interno di tutti gli screen
3-Impossibilità di fare copia incolla dei blocchi o di editare le varie schermate contemporaneamente

Ad ogni modo le basi sono buone, e senza annoiarvi troppo andiamo a visionare il tutorial:


Per finire vediamo un pò più nel dettaglio i metodi messi a disposizione per lavorare sugli screen multipli:

Questi li troviamo in "build-in" control.

  1. Open another screen non fa altro che aprire il nuovo schermo, dobbiamo dare il nome esatto dello schermo così come indicato in design editor
  2. Open another screen with start value, come il precedente solo che possiamo passare un valore (testuale, come anche un elenco di valori) al nuovo schermo (utile quindi per passare delle informazioni al nuovo screen)
  3. get start value si usa nello schermo di "destinazione" per leggere il valore eventualmente passato
  4. close screen - chiude lo schermo corrente (e torna allo schermo precedente se esiste, altrimenti chiude l'app
  5. close screen with value - il più usato, chiudo lo schermo corrente e passo allo schermo precedente i dati che metto in "result" (quello che vi ho fatto vedere nel video)
Passiamo ora all'unico nuovo metodo disponibile per ogni nostro "Screen":

Come avrete intuito quando chiudo uno screen e torno al precedente, questo evento viene generato dall'applicazione.
In otherScreenName avrò il nome dello schermo appena chiuso e in result avrò il valore che mi passa lo schermo precedente (proprio come nell'esempio del video)

Spero che il tutto non sia troppo complicato (in effetti forse un pò lo è...) devo imparare bene il tutto anch'io.

Un suggerimento è quello di provare ad usare il TinyDb per passare i dati da uno schermo all'altro, infatti usando TinyDb possiamo leggere ad ogni Screen.initialize i valori che ci servono, visto che appunto i dati salvati con TinyDb sono gli unici disponibili a livello "globale" dall'applicazione.
Buono studio ed alla prossima!!! :)

Questo il link per scaricare il sorgente dell'app:

Se invece volete un tutorial più semplice che spieghi come creare un app con più schermate ma senza passaggio di parametri vi consiglio la lettura del seguente post:



117 commenti:

  1. Ciao,
    intanto ti volevo ringraziare per questo utilissimo tutorial. Inoltre, volevo far notare un piccolo errore nell'applicazione. Una volta installata l'app sul telefono, se andiamo sulle impostazioni, nelle textbox non inseriamo niente e poi riandiamo nella screen1 il sistema segnala un errore perchè non può prendere gli elementi dalla lista. Io ho risolto "inizializando" le textbox con il valore 0.

    RispondiElimina
    Risposte
    1. Grazie Majestic,hai perfettamente ragione,anzi di errori ne ho scoperti anche altri (tipo se metti un valore superiore a 255 nella scelta del colore)...è che se sistemavo tutto il video non durava 20min ma 50 :)
      spero capiate anche queste esigente,io do l'idea generale poi gli "affinamenti" stanno a voi ;)

      Elimina
  2. Grazie infinite guida fatta benissimo!! Io ho una domanda non inerente al multi-screen, non sapendo dove scriverla la metto qui:
    C'è un modo ovviamente tramite app inventor di inserire qualcosa che mi permette di mandare gli aggiornamenti all'app che ho installato sul telefono? Non so se mi sono spiegato bene, praticamente io ho creato una mia app e ho fatto un aggiornamento ma non volevo scaricarla sul pc per poi passare l'app sul telefono ed installarla, ma volevo tramite internet che lui trovasse che ci sono gli aggiornamenti e automaticamente me li va ad installare sostituendo la versione precedente...mi sapresti aiutare? grazie anticipatamente, continua così sei un grande!!!!!

    RispondiElimina
  3. Nuib,quello che chiedi non è semplice da realizzare,tutto (o quasi) si può fare...
    per esempio puoi creare una variabile con Tinywebdb che controlla online (su un tuo sito) qual'è l'ultima versione dell'app e se differente da quella installata mostra un messaggio che chiede di effettuare l'aggiornamento.
    La cosa a mio avviso molto più semplice è quella di pubblicare la propria app in Google Play Store, in questo modo quando tu la aggiorni tutti gli utenti che l'hanno installata ricevono la notifica (senza bisogno di fare nulla all'interno dell'app)

    RispondiElimina
    Risposte
    1. Grazie per la risposta, molto utile, peccato solo che io la pubblicherei anche nel Google Play Store ma bisogna pagare se non erro e quindi sinceramente penso che cercherò di creare qualcosa con tinywebdb per esempio!! Grazie mille.
      Se mi posso permettere vorrei chiedere se riuscissi a fare un nuovo tutorial sul FusionTablesControl che devo dire la verità non mi è molto chiara la sua funzione...! Grazie ancora

      Elimina
    2. Puoi anche pensare di usare SlideMe è un market alternativo che mi pare avvisi anche lui quando c'è un update della tua app, certo che SlideMe non è sicuramente installato in tanti dispositivi quanto il playstore.
      Si pagano 25$ una tantum, ovvero il tuo account resta poi valido a vita.
      Per le FusionTable ci avevo pensato, sicuramente arriverà qualcosa ma non ti posso dare una data certa...

      Elimina
    3. Interessantissimo non conoscevo SlideMe buono a sapersi!! Fantastico allora speriamo che arriverà presto questo tutorial!

      Elimina
  4. Ciao Seba!
    Ma in un mondo che si basa sul "copia ed incolla" sono io che non so come fare...o non esiste un modo per copiare tutto da una scrren1 alla screen2 in maniera rapida? o da uno screenArrengment ad un altro?
    Grazie

    RispondiElimina
    Risposte
    1. Salvo, hai perfettamente ragione! ed in molti hanno chiesto di implementare un modo rapido per copiare blocchi, speriamo si diano da fare in fretta, infatti ad oggi è una delle limitazioni più fastidiose del multiscreen...incrociamo le dita fiduciosi:)

      Elimina
    2. Perdona seba la mia ignoranza, ma non riesco a capire quali tasti devo premere per copiare blocchi..

      Elimina
    3. Ciao Fray Dv, per copiare i blocchi basta che fai CTRL-C e poi CTRL-V come in tutte le applicazioni Windows (ovviamente lo puoi fare solo tra elementi dello stesso screen)

      Elimina
  5. Altra domanda: per usare l'activitystarter esiste un elenco di tutte quelle disponibili per android? O devo mettere il cellulare in debug mode?

    RispondiElimina
    Risposte
    1. non esiste un elenco completo, uno parziale lo trovi alla pagina di app inventor:

      http://beta.appinventor.mit.edu/learn/reference/components/other.html#ActivityStarter

      mentre per trovarne altri devi collegare il telefono al pc, con adb e logcat, vedere nei log la stringa che esce quando lanci il programma che ti interessa e capire da li i parametri (come è anche spiegato nella pagina di qui sopra)
      in bocca al lupo!

      Elimina
  6. Ciao forse potete aiutarmi, sto craeando un programma con dei suoni , vorrei poter riprodurre un file sonoro per un tot di tempo o per un numero di volte. Esempio filemusicale.mp3 vorrei che fosse riprodotto per 10 minuti premendo il bottone 10min. Oppure vorrei che fosse riprodotto per 3 volte sempre premendo un bottone.
    Se non sono stato molto chiaro chedetemi pure.
    Grazie

    RispondiElimina
    Risposte
    1. Ciao,
      per riprodurlo 3 volte non ci sono grossi problemi, basta che fai un ciclo while con un contatore settato a 3
      mentre per riprodurlo per 10 minuti esatti potresti far partire il suono e far partire contemporaneamente un timer, all'evento clock.timer dai il comando per stoppare il file audio.
      E' tutto abbastanza semplice anche se non so il tuo livello con AI,ad ogni modo forse ci son problemi nel caricare un mp3 di 10 minuti perchè attualmente AI ha problemi con file di dimensioni troppo grosse

      Elimina
    2. Confermo tutto in merito ai problemi con file grossi.

      Elimina
  7. Ciao Sebastiano! A fine mese admob per siti mobile non dovrebbe piu funzionare,tu cosa hai in mente per sostituire i banner di acqua alta?

    RispondiElimina
    Risposte
    1. Eh già, ho visto che è arrivata la mail, dovremmo chiedere se va bene mettere gli ad sense in delle webview, altrimenti dobbiamo aspettare che il team di AI implementi ufficialmente Ad Sense da design editor.
      Certo che dopo tutto questo sbattimento per trovare il modo di mettere gli ads ora ci segano le gambe in questo modo...non ho parole :)

      Elimina
    2. http://www.mobfox.com/?aid=9169
      prova questo, è identico ad admob, solo che vogliono un paio di giorni per attivare i banner...io sono ancora in attesa.

      Elimina
    3. Molto interessante, proverò sicuramente, fammi avere subito notizie quando ti hanno attivato e se riesci a integrarlo bene con AI :)

      Elimina
    4. http://www.mobfox.com/?aid=9169
      Confermo che mobfox funziona come admob, impiegano qualche giorno ad attivare la campagna pubblicitaria ma poi è molto simile. adesso si aspetta il payout!

      Elimina
    5. benissimo a questo punto devo solo davvero trovare il tempo di aggiornare la mia app affinchè supporti questo tipo di mobile ads. Grazie ancora per la preziosa segnalazione!

      Elimina
    6. ciao aa tutti, chiedo sopratutto a salvo, io mi sono registrato ma non ho capito, come si integra la cosa... ideee??

      Elimina
  8. Secondo te è possibile cancellare la cache dei dati di un applicazione con un bottone ed un activity starter?
    Comunque ci vuole un forum in questo blog...ormai è indispensabile! :-P

    RispondiElimina
    Risposte
    1. Perché cancellare la cache per cancellare i dati?puoi direttamente cancellare i dati del tinydb (quello che uso io per l'app acqua alta) direttamente coi metodi del tinydb stesso...
      Per il forum hai assoultamente ragione,lo vorrei fare ma non ne ho mai fatto uno,suggerimenti in merito o un servizio forum di google che si interfacci anche con blogger?

      Elimina
    2. io proverei con questo:
      http://vincicoppolas.blogspot.com/2011/02/inserire-un-forum-in-grande-stile-su.html
      Sarebbe fantastico avere un forum tutto italiano.
      E poi i forum generano più visite al tuo blog perche la gente ritorna a verificare le risposte.

      Elimina
    3. Grazie infinite VeSaDev! messo nei preferiti,tra i buoni propositi per i prossimi aggiornamenti sicuramente quello di implementare finalmente il forum!!! :)

      Elimina
  9. ciao seba non e possibile fare un tutorial di come realizzare una app per una radio fm con audio in streaming con i pussante play stop e pussante volume audio? grazie

    RispondiElimina
    Risposte
    1. Non credo sia necessario un tutorial devi solo trovare lo stream mp3 e darlo come indirizzo al componente player
      Ad ogni modo se hai difficoltà scrivimi per mail e ti spiego meglio

      Elimina
    2. interessa anche a me! io ho provato ad impostare il source del player con il link del flusso radio, ma non va! come si utilizza il component? scrivi qualcosa qui! può essere utile a molti!

      Elimina
    3. Salvo, funziona proprio così solo che lo stream deve essere mp3, e non tutti vanno...

      Elimina
  10. ciao, ragazzi, ciao grande Sebby, dopo aver realizzato x cazzeggio un po di cosine, una notte mi sono svegliato e mi sono detto che tramite A.I. si poteva fare un bel giochino tipo memory.

    Per fare una cosa figa ho progettato la versione free con tre livelli cosi strutturato:

    inizio con sigla e animazioni x 12 secondi (canvas ed imagesprite)
    po va al menu generale - li musica di sottofondo, tre button per i tre livelli e 5 button con notify che dice che quelli sono per la versione full.


    fin qui funziona quasi tutto....

    quindi premi il button liv 1 e ti porta in na scermata di intro del livello, fatta con canvas ed imagesprite, quindi tocchi e finalmente siamo al livello 1.

    qui inzia il casinissimo... tutte le musiche di sottofondo si mescolano, adesso sto provando a chiudere gli screen in qualche modo... ma se funzia viene proprio figo... tutto grazie a Seby... dimenticavo alla fine io ho comprato un cell android per fare i test e mi sono accorto che conosco meglio A.I. del mio cellulare che figataaaaa

    RispondiElimina
    Risposte
    1. Bravo Mario! sei un vulcano di idee!!!! continua a lavorarci su e a provare, può essere che chiudendo gli screen fermi anche i suoni, altrimenti prova con il comando che ferma la musica quando cambi screen.

      Elimina
  11. Ciao ragazzi, io sto realizzando un app con multi screen ma ho un problema:
    il primo screen p impostato con il clock e dopo 2 secondi passa al secondo screen il problema è che quando vado a premere il tasto indietro non deve tornarmi nello screen 1 ma deve chiudere l'applicazione...quindi come faccio a chiamare lo screen due e allo stesso tempo a chiudere lo screen 1??

    RispondiElimina
    Risposte
    1. purtroppo secondo me c'è un baco in AI perchè il close screen di fatto non funziona.
      Per fare quel che dici te basterebbe all'apertura di Screen2 fare il close di Screen1 anch'io ho provato ma non chiude nulla.
      Anche se provi "close application" in realtà chiude solo l'ultimo screen e torna a quello precedente (se esiste) o se si è al primo chiude l'app.
      Speriamo sistemino in fretta :)

      Elimina
  12. ciao Seba, senti nel multiscreen c'è la possibilità di passare una immagine da uno screen all'altro??se si, come si fa??

    RispondiElimina
    Risposte
    1. puoi passare solo valori testuali
      però se l'immagine l'hai caricata nei "media" questi sono disponibili in tutti gli screen, quindi per esempio potresti caricare tutte le tue immagini in "media" (design editor) e poi da uno screen all'altro passi il nome dell'immagine e non l'immagine vera e propria, spero di essermi spiegato! ciao

      Elimina
  13. Ciao, prima di tutto complimenti per le guide, utilissime e molto complete! Io avrei una domanda, come faccio a confrontare una parola o una stringa digitata dall' utente nella textbox con una preimpostata che gli dò io? Avrei bisogno di fare in modo che quando sono uguali mi cambi schermata. Ho provato a fare così: http://img11.imageshack.us/img11/6028/problemaappinventorsuco.png ma non funziona, come si fa? :(

    RispondiElimina
    Risposte
    1. il codice mi sembra giusto,prova ad usare le funzioni di "watch" del blocks editor per vedere che valore ha barraricerca.text, e poi quel blocco dove lo hai inserito?
      devi inserirlo all'interno di un evento, per esempio crei un pulsante "verifica risposta", all'evento click di quel pulsante fai la verifica e se le due stringhe coincidono dovrebbe aprirsi correttamente l'altra schermata

      Elimina
  14. Ciao Seba, ho un piccolo problema... mi sono da poco avvicinato ad AI grazie ai tuoi tutorial... sto facendo delle piccole prove.. ma non sto riuscendo a far passare da una screen all'altra con la funzione button click... ho letto che devo farlo mettendo dentro buttonclick, open anotherscreen + testo:nome screen... quando testo l'applicazione sia sul cell che sull'emulatore non fa nulla... avevo visto un tuo tutorial dove collegavi 3 pagine (main - about - help) con l'omino di south park di sfondo ma non lo trovo più... ho provato anche con il sistema che hai spiegato in questo tutorial (http://www.youtube.com/watch?v=PzyPO09rny4) con il metodo visible true-false ma niente non mi cambia l'immagine.. come posso fare? quello che mi interessa per il momento è passare da una screen all'altra tramite click.. Grazie mille
    Andrea

    RispondiElimina
    Risposte
    1. Per il multiscreen devi per forza scaricare l'apk sul telefono, da emulatore non va
      con i miei sorgenti ti funziona?

      Elimina
    2. Non funziona nemmeno sul cell...
      la procedura che hoi fatto è questa: screen1 vertical arrangment con all'interno un button1(immagine)
      Screen2: un vertical arrangment, con all'interno un immagine.
      Procedura: Screen1 Button1Click-openanotherscreen-text(Screen2)
      ma non va... sbaglio qualcosa?
      Grazie

      Elimina
  15. Ciao complimenti per la guida, una domanda: l'evento Other screen close si può usare solo una volta in uno Screen? Cioè mi pare di capire che ad esempio su Screen1 non posso mettere più eventi OSC per sapere se l'utente è tornato da Screen2 o da Screen3... come posso fare per ottenere questo? Grazie ;)

    RispondiElimina
    Risposte
    1. l'evento Other Screen Closed viene generato come dice il termine stesso alla chiusura di un altro screen, poi al suo interno puoi far compiere più operazioni mettendo tutto sotto lo stesso blocco.
      Per capire se l'utente è tornato da Screen2 o Screen3 devi controllare il "otherscreenname"
      ovvero metti due blocchi uno con otherscreenname = Screen2 e uno con = Screen3
      Gli eventi all'interno dei due blocchi verranno eseguiti solo se lo schermo chiuso in precedenza è rispettivamente Screen2 o Screen3

      Elimina
  16. Caro Sebastiano, spero tu mi risponda presto perche' sto impazzendo. Nella app che sto creando c'e' uno screen iniziale con il logo e un timer, poi lo screen della home. Come faccio a far iniziare la sequenza degli screen sempre dal primo con il logo? Se si interrompe l'app il telefono la fa ripartire sempre dallo screen da dove si e' interrotta.Ti prego aiutami. Grazie<3

    RispondiElimina
    Risposte
    1. Ciao Gaia,purtroppo non è possibile, questa è la gestione del multitasking di Android, se l'app è stata avviata ed ha raggiunto un certo stato (diciamo la schermata principale) e l'utente poi fa altre attività sul telefono, quando poi fa ripartire la tua app parte dall'ultimo stato raggiunto.
      A meno che non abbia esaurito la memoria nello smartphone (cosa che accade spesso in vecchi cellulari),nel qual caso riprenderebbe l'attività dall'inizio.
      Mi dispiace ma non vedo soluzioni a questo problema

      Elimina
  17. Ciao Sebastiano anzitutto complimenti per i tutorial, avrei una domanda da fare.. sto creando un'app con più schermate per il momento ne ho solo due :) quella principale ed una di "opzioni". Nella prima ho delle label con del testo e vorrei che tramite delle textbox nella schermata "opzioni" l'utente possa cambiare il testo di queste label. Si può fare ?

    RispondiElimina
    Risposte
    1. Certo che si può fare, hai due strade percorribili:
      1 - usi "open another screen with value" e passi nel value i valori delle tue label (magari come testo separato da virgole), poi nell'altro schermo li leggi con "get start value"
      2 - usi un TinyDb per memorizzare le label in Screen2 (quella delle opzioni), e poi in Screen1 leggi lo stesso tag da TinyDb
      ad ogni modo nel tutorial mostro il metodo 1,prova a riguardarlo con attenzione così magari capisci meglio cosa intendo,ciao

      Elimina
    2. Grazie!! ci sono riuscito col primo metodo.

      Elimina
    3. Ma cosa stò sbagliando???
      a me non funziona, io devo aprire una screen2 con un valore, 1 oppure 2.
      Utilizzo l'open another screen con start value da screen1, mi apre screen 2 ma non riesco a leggere il numero passato. Nell'inizializzazione di screen2 utilizzo il get start value in un IF getstartvalue=1 ... ma probabilmente sbaglio il modo per leggerlo.
      Ciao e grazie
      Angelo

      Elimina
    4. prova a stampare il valore del get start value con una label, purtroppo le app multiscreen le dobbiamo compilare come apk per provarle e non vanno da blocks editor, e questo ci complica un pò la vita...
      magari è un errore banale di sintassi, io imposterei delle label giusto per il debug ... :)

      Elimina
  18. Ciao Sebastiano, complimenti vivissimi per il blog.
    Fatto benissimo e spiegato ancora meglio! Bravo e grazie soprattutto per quello che fai!
    Ti posso chiedere di spiegarmi il metodo 2 che hai accennato a Mauro Lo Bianco?
    In particolare come richiamare i dati dal TinyDB usato nello screen 1.
    Io riesco a memorizzare le informazioni in screen 1 ma non so come accedere allo stesso TinyDB da una screen 2 (se lo aggiungo, ne crea una nuova istanza).
    Sono un pochino confuso...

    RispondiElimina
    Risposte
    1. Nessun problema, figurati,
      in screen2 devi aggiungere un altro elemento TinyDb, poi sempre in screen2 se carichi lo stesso "tag" di quello che avevi memorizzato in Screen1 lo leggi senza problemi.
      Esempio, in Screen1 fai uno store sul tinydb con nome tag "highscore" e valore "100"
      in Screen2 fai un read dello stesso nome tag "highscore", ti restituirà il valore "100"
      buon app inventing :)

      Elimina
  19. Ciao Sebastiano
    Da un paio di giorni mi sono avvicinato a questo, per me, nuovo mondo e mi sono "bevuto" quasi tutti i tuoi tutorial.
    Volevo sapere se c'è la possibilità di passare da uno scrren ad un altro con il semplice slide del dito a desta o sinistra senza usare i button.
    Grazie per l'ottimo lavoro.
    Ciao
    Cristiano

    RispondiElimina
    Risposte
    1. Purtroppo non è possibile perchè dovresti usare un canvas, ma lo slide funzionerebbe solo su di esso e su di esso non si riescono a mettere altri button,textbox,etc...
      una soluzione alternativa può essere quella di mettere una "fascia" in alto alla tua app, fatta appunto con un canvas e poi usare l'evento "flung" per spostarsi da uno screen all'altro, però non è una soluzione ottimale,per ora meglio continuare ad usare i bottoni :)

      Elimina
  20. Ciao, utilissime le tue guide. Anche molto comprensibili. Volevo chiederti come potrei mettere ad un click su un bottone, l'apertura casuale di uno screen. Spero di essere stato chiaro. Grazie

    RispondiElimina
    Risposte
    1. Puoi usare la funzione random per far uscire un numero, diciamo da 1 a 5 se hai 5 screen,
      crei una lista di 5 elementi, ognuno col nome di uno screen,
      poi devi essere ovviamente sicuro di avere questi 5 screen, chiamati diciamo screen1,screen2,etc
      alla pressione del pulsante apri lo screen con la funzione select item from list per selezionare il nome giusto dello screen random da aprire... :)

      Elimina
  21. Ciao sebastiano complimenti per le guide e tutti i tuoi utilissimi suggerimenti.
    Avrei una domanda: sto creando un app con screen molto "lunghi" che avrei bisogno si aprissero ad un altezza precisa...è possibile?

    Grazie

    RispondiElimina
    Risposte
    1. Ciao, devi ovviamente lasciare la spunta su "scrollable" dello schermo e poi inserire un vertical arrangement con altezza fissata in xx pixel,
      purtroppo però facendo così a seconda della risoluzione del cellulare che usi saranno visibili sempre un tot di pixel per pagina diversi a seconda appunto della risoluzione verticale...

      Elimina
  22. ciao Sebastiano, vorrei chiederti un'informazione! sto creando un calendario,quindi ho creato oltre allo screen1, altre 12 schermate. Per ogni schermata vorrei inserire una textbox per inserire un contenuto. All'ultimo mese dell'anno vorrei fare un resoconto di questi contenuti, facendoli apparire su un'altra textbox. hai per caso delle idee su come posso fare? ad esempio: per ogni mese sulla textbox viene scritto un numero e alla fine vorrei la somma di quei numeri.
    grazie in anticipo

    RispondiElimina
    Risposte
    1. Si, ti consiglio usare un TinyDb in ogni screen così da memorizzare il dato che vuoi visualizzare sullo screen che fa da "riassunto", ovviamente il nome del tag da salvare deve essere sempre usuale così puoi manipolare (leggere e scrivere) questo valore da ogni screen e non hai nessun problema nel visualizzarlo nell'ultimo screen.
      Per esempio salvi il tag "mesiconeventi" e lo incrementi di 1 ogni volta che l'utente salva la textbox in uno dei 12 screen. Poi nel 13 screen leggi il valore e lo visualizzi.

      Elimina
    2. scusa seba, ma non ho capito bene le ultime due righe!! potresti spiegarmi molto dettagliatamente, sono alle prime armi!!

      Elimina
    3. Intanto in ogni screen metti un elemento "TinyDb",
      se alla fine vuoi un contatore con il numero di mesi che hanno un evento (per fare un esempio)
      dopo che l'utente inserisce il valore nella textbox, aggiungi l'evento per il salvataggio del tinydb con tag "mesi_con_eventi", il valore da memorizzare sarà = mesi_con_eventi+1
      Questo pezzettino di codice lo metti su ogni screen (lo devi ricreare perchè non esiste copia incolla tra screen diversi) in modo che ad ogni mese in cui l'utente aggiunge un evento il tuo valore sarà il valore esistente + 1.
      Poi nello screen col riassunto di tutti i mesi sempre con TinyDb leggi il valore del tag "mesi_con_eventi" che sarà quindi il numero di mesi contenenti almeno un evento.
      Se ancora non riesci vieni sul forum che li possiamo anche postare le immagini del blocks editor, ciao!

      Elimina
    4. credo di aver capito! ora vorrei chiederti un'altra cosa riguardante il tasto back del telefonino. è possibile controllarlo quando ci si trova all'interno di un'applicazione?

      Elimina
    5. si, esiste l'evento "back pressed" o qualcosa del genere, mi pare sia nei controlli dello screen in blocks editor, se non specifichi niente allora ha il comportamento di default,altrimenti lo controlli te come vuoi

      Elimina
    6. perfetto, gentilissimo, alla prossima!!

      Elimina
  23. Ciao Sebastiano, mi trovo difronte a un canvas. Faccio canvas1.SaveAs --> text con il percorso dove deve andare a salvare(mnt/sdcard/pictures/canvas1.png). A questo punto ti chiedo se posso creare una cartella personale all'interno senza utilizzare quella già esistente,cioè(mnt/sdcard/MyPersonalPhoto/canvas1.png).
    Grazie mille!!

    RispondiElimina
  24. ciao, penso di poterti dare una mano. una volta che hai inserito in appinventor ill percorso dove salvare l'immagine, se la cartella "MyPersonalPhoto" non esiste gia nel tuo telefono te la creerà automaticamente. Utilizzanto un file manager puo constatare la presenza della nuova cartella creata. nb
    Io ho dovuto riavviare il dispositivo prima di veder comparire la cartella da me creata.

    RispondiElimina
    Risposte
    1. perfetto,quindi mi basterà mettere nel blocco (canvas1.SaveAs) un text con scritto (/mnt/sdcard/MypersonalPhoto/canvas1.png).

      Elimina
  25. si ma poi ti troverai davanti a un problema: il secondo disegno che salverai si chiamaerà sempre canvas1.png
    quindi per ovviare a tutto questo metti una bella textbox dove l'utente puo inserire il nume che vuole dare al disegno e quindi avrai /mnt/sdcard/MypersonalPhoto/nomedisegno

    RispondiElimina
  26. il secondo canvas lo salverò con il nome canvas2.png, perchè dovrebbe chiamarsi canvas1.png?
    nel primo farò: canvas1.SaveAs -->(mnt/sdcard/MyPersonalPhoto/canvas1.png) mentre nel secondo farò: canvas2.SaveAs --> (mnt/sdcard/MyPersonalPhoto/canvas2.png). così salverà due file diversi, sbaglio?

    RispondiElimina
    Risposte
    1. ringrazia l'altro "seb" per le ottime risposte! :)
      ad ogni modo il nome del file ti conviene comporlo con una make text, così puoi ad esempio salvare l'immagine come maketext "canvas" + "contatore" , dove contatore è una variabile numerica che incrementi dall'app stessa

      Elimina
    2. ok grazie mille!! ora immaginiamo di avere ad esempio 3 canvas e ciascuno dei tre conterrà tre immagini(o.png/1.png/2.png). premendo in tutti e tre i canvas faccio venire fuori l'immagine 1.png. A questo punto come posso fare per far visualizzare in una textbox la somma delle immagini che ho inserito?(cioè la 1.png contiene la raffigurazione di uno smile triste e avendolo inserito 3 volte vorrei che mi apparisse il numero 3 in una textbox). Non so se mi sono spiegato bene!!

      Elimina
    3. Quando crei l'evento che ti inserisce l'immagine 1.png alla pressione del canvas, incrementi anche un contatore (crei una variabile che ne so chiamata "conteggio_click"
      poi visualizzi questo contatore nella tua textbox

      Elimina
    4. devo fare una schermata con una ventina di canvas e al suo interno deve girare 4 immagini.png.
      conviene fare 20 variabili,cioè una per ogni canvas?

      Elimina
    5. stiamo andando troppo OT per l'argomento di questo post, per favore vieni sul forum e poi linkami qui o in privato la discussione (cerca di ricapitolare tutte le domande che hai) grazie

      Elimina
  27. ok ok, scusami avevo capito male...

    RispondiElimina
  28. Ciao Sebastiano, ho realizzato, per studio, una app con 4 screen (screen1, pippo, pluto, topolino) nello screen1 vi sono 3 pulsanti che portano alle 3 schermate, i blocchi quindi sono semplici, pippo.click con text pippo apre il relativo screen, pluto.click con text pluto apre lo screen pluto e topolino.click con text topolino apre il suo screen, con l'emulatore, ogni singola schermata funziona, a parte lo screen1 che da l'alert di mancato collegamento in fase di test, scaricando l'apk sullo smartphone ricevo, al click di un bottone, l'errore 902, screen not found 'nome screen', hai idea del perchè non vengano trovate le schermate?
    Ciao Manuel

    RispondiElimina
    Risposte
    1. Quell'errore esce se il nome dello screen non è esatto e rimanda a uno screen che non esiste, controlla bene tutto quello che hai fatto e magari scarica il mio sorgente e vedi come è realizzato

      Elimina
    2. Si, è vero, ricontrollando ho visto che il richiamo alla schermata iniziale lo avevo scritto minuscolo, mentre va scritto esattamente, android/linux è Case Sensitive, come lo si vede o come lo si è intitolato, ora funziona alla grande.
      Ciao, notte, Manuel

      Elimina
  29. Ciao, vorrei sapere come poter mettere la condizione "if (c'è una connessione internet attiva) apri screen1 ... else apri screen2" ... come faccio a verificare se il telefono è connesso o meno? Nell'app, screen1 ha un webviewer, mentre lo screen2 ha solo un immagine. Quindi io devo fare in modo che quando sia apre l'app viene verificata l'esistenza di una connesione internet, se c'è(return true) apre screen1 se non c'è apre screen2 ... Mi serve solo sapere che devo mettere alla voce "test" dell'if!!
    Grazie mille!

    RispondiElimina
    Risposte
    1. se ricordo bene si può fare per esempio col componente web, e gli fai caricare la pagina che ne so www.google.it, se il returncode da ok vuol dire che la connessione internet è attiva
      Qui trovi i blocchi da utilizzare per il controllo completo:
      http://seblogapps.blogspot.it/p/app-inventor-forum-italia.html#/discussion/comment/1099
      eventualmente li puoi modificare in base alle tue necessità

      Elimina
  30. Salve, grazie per aver risolto il mio problema, ma adesso ne ho trovato un'altro che dovrebbe riguardare tutti gli sviluppatori che utilizzano MIT app inventor... pubblicando l'app su play store, questo mi dice che l'app non è compatibile con alcuni dispositivi (233), in particolare quelli più piccolini che per esempio montano android 2.3.4 (il mio) e inferiori, ma secondo me anche chi ha android 2.3.6 risulta non compatibile... E' così per tutti ?? Si può rimediare? Questo a mio avviso è un grave danno siccome questi tipi di dispositivi sono diffusissimi!!

    RispondiElimina
    Risposte
    1. Dimenticavo di dire, che di conseguenza io che ho un dispositivo android 2.3.4 non riesco a trovare l'app su playstore, ma se vado dal browser sul play store, trovo l'app e sulla colonnina di destra invece sta scritto "per versioni android 1.5 e superiori" !!Come mai questo errore?? Si può risolvere?!?!

      Elimina
    2. Per avere maggiore compatibilità bisogna passare i propri progetti (partendo dal file .apk) con un tool tipo Marketizer Cloud che permette di editare il manifest ed aggiungere i tag "fondamentali" per la compatibilità su tutti i dispositivi,
      tali tag sono:



      una volta ricompilata l'app con tali tag questa risulta disponibile su quasi 1000 dispositivi.
      Puoi vedere le varie guide sulla pubblicazione sul Play Store per maggiori dettagli,
      puoi aggiornare la tua app e caricare la versione col manifest aggiornato su Play Store per non perdere le installazioni che hai avuto fino ad oggi :)

      Elimina
    3. scusa mi ha tagliato i tag che sono questi:

      ...supports-screens android:resizeable="True" android:smallScreens="True" android:normalScreens="True" android:largeScreens="True" android:anyDensity="False"/...

      (al posto dei ... devi mettere < e >)

      Elimina
    4. Ok appena ho una mezz'oretta di tempo proverò a fare come mi hai detto!! Grazie!!

      Elimina
    5. Perfetto il numero di dispositivi non compatibili è sceso a 33, numero più che accettabile !!! Grazie!!

      Elimina
  31. Ciao, sai per caso come far funzionare un app in background? e possibile farlo con app inventor?

    RispondiElimina
    Risposte
    1. l'unico componente che funziona anche in background è il componente "texting" e si può utilizzare per attivare l'app all'arrivo di un sms.
      Tutti gli altri componenti lavorano solo se l'applicazione è attiva e in primo piano

      Elimina
    2. Mi sapresti dire come faccio a far attivare l' app all' arrivo di un sms con activitystarter?

      Elimina
    3. non si usa activitystarter ma il componente "texting" , ne devi aggiungere uno alla tua app, da design editor imposta la proprietà ReceivingEnabled su "always"
      in questo modo quando arriva un sms anche con l'app chiusa verrà visualizzata una notifica nella barra delle notifiche,a questo punto l'utente se seleziona tale notifica metterà di nuovo in primo piano la tua app (e l'app potrà leggere numero di telefono e testo dell'sms)

      Elimina
  32. Ce anche il componente clok che lavora in background ma io pensavo che magari ci fosse un modo per lasciare attiva l app anche dopo che viene chiuso lo screen

    RispondiElimina
    Risposte
    1. che io sappia il componente clock funziona solo con l'app in primo piano, continua il conteggio anche con l'app in secondo piano ma non può riattivare l'app alla generazione dell'evento timer...

      Elimina
  33. Ciao, davvero molto utile come tutorial, però ho un piccolo problema e ti pongo il quesito seguente:
    Ho impostato che nel momento in cui clicco sul tasto "Si" deve aprirsi il nuovo screen dove è presente solo un'immagine, il problema è che non capre assolutamente nulla e la nuova scheramta che si apre è totalmente bianca... sapresti dirmi come mai o cosa sbaglio?

    RispondiElimina
    Risposte
    1. ciao, con queste info è difficile aiutarti, controlla bene tutto, magari è un semplice errore di digitazione del nome dello screen, ricorda che deve essere perfettamente identico anche maiuscole e minuscole, fammi sapere, ciao!

      Elimina
  34. Ciao, volevo sapere come posso inserire con mit app inventor un logo alla mia app in modo tale che nell'elenco delle app del mio telefono venga visualizzata con quel logo e non con quello standard di mit app.

    RispondiElimina
    Risposte
    1. basta che cambi l'icona della tua applicazione,
      carica un immagine 128x128 o 512x512 con il logo della tua app da design editor alla voce "icon"

      Elimina
  35. Ciao Sebastiano grazie per i tuoi tutorial sono fantastici! Chiari e ben spiegati.

    Volevo chiederti aiuto, ho provato con App Inventor 2 a utilizzare il metodo di chiusura dello schermo con passaggio del valore e sucessiva apertura di un altro schermo con il valore passato ma non funziona.
    in pratica ritorna alla schermata principale ma non fa aprire l'altra schermata è come se l'evento chiusura altro schermo non funzionasse, idee?

    Grazie comunque

    Steve

    RispondiElimina
  36. Ciao..ti ho gia contattato su youtube..cmq volevo dirti se invece di inserire dei pulsati per amdare nelle altre schermate...e possibile metterne uno quando clicchi sul yasto impstazioni ? Invece che apparire stop this application ..metterci qualcos altro ? Tipo delle info ...

    RispondiElimina
    Risposte
    1. no, non è possibile con le versioni gratuite di App Inventor, mi dispiace
      se vuoi personalizzare il tasto menù devi usare una delle due versioni più famose a pagamento,
      o quella di Hossein o quella di Jose, guarda sul forum se hai bisogno di maggiori info, ciao!

      Elimina
  37. Ciao Sebastiano, ottima guida, io sto provando con AI2 ma ho provato a creare un programmino semplice per il passaggio dei parametri ma non riesco a farlo funzionare. Ti spiego: ho due screen (screen1 e screen2). Nello screen1 ho una label ed un pulsante. Nello screen2 ho 3 texbox ed un pulsante. Cliccando sul pulsante dello screen1 passo allo screen2, qui inserisco nella seconda textbox delle lettere e cliccando sul pulsante2 torno al primo screen e vorrei che venga riportato quello che ho scritto nella textbox sulla label dello screen1.

    Se sono riuscito a spiegarmi cerco di spiegarti anche i blocchi:

    screen1 abbiamo:
    1)when button click open another screen = "Screen2"
    2)when screen1 other screen closed do
    if get otherscreenname = "Screen2"
    then set label1.text to get result

    screen2 abbiamo:
    1)when button click do
    open another screen with start value screnName = "Screen1"
    startvalue textbox2.text

    Riesci ad aiutarmi?

    Grazie
    Ciao

    RispondiElimina
    Risposte
    1. Dovrebbe funzionare, hai scritto i nomi degli screen correttamente (maiuscole/minuscole?)
      Su screen2 ti conviene fare
      Close screen with value textbox2.text
      così eviti di tenere aperto uno screen per nulla in memoria,
      se hai ancora problemi postami i tuoi blocchi e provo a vedere...

      Elimina
    2. Riuscito a farla funzionare, il problema stava nel fatto che io la scaricavo sul telefono tramite il qr code del mit AI2 companion. Invece scaricandola direttamente sul telefono ha funzionato, grazie mille. Ciao

      Elimina
  38. Ciao :) ma nel caso in cui avessi tanti suoni e volessi fermarli tutti con un solo pulsante qual'è la giusta procedura da inserire??

    RispondiElimina
    Risposte
    1. Dipende quanti player hai, se hai tanti player quanti sono i suoni devi chiamare il metodo player1.stop per ogni suono che hai , li puoi mettere tutti in cascata e fare eseguire tutti i comandi stop alla pressione del singolo button.

      Elimina
  39. Ciao Sebastiano, innanzitutto grazie per il grande lavoro che fai!!! E' utilissimo. Io vorrei mandarti una mia app per risolvere un problema, sono disposto anche a pagarti! Mandami una mail qui johnairbag@hotmail.it

    In ogni caso ti espongo il problema già qui.
    - Ho provato a fare copia-incollla e rinomina per copiare le schermate, ha accettato il file il software online solo che non mi fa salvare con nome più il progetto! L'app è pronta e tiene un nome inguardabile!
    - Al 12 clik (sono varie schermate) si blocca. Il catlog è questo

    RispondiElimina
    Risposte
    1. 05-13 11:18:03.521 E/AndroidRuntime(6021): FATAL EXCEPTION: main
      05-13 11:18:03.521 E/AndroidRuntime(6021): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
      05-13 11:18:03.521 E/AndroidRuntime(6021): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:482)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at com.google.appinventor.components.runtime.util.MediaUtil.decodeStream(MediaUtil.java:306)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at com.google.appinventor.components.runtime.util.MediaUtil.getBitmapDrawable(MediaUtil.java:296)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at com.google.appinventor.components.runtime.Form.BackgroundImage(Form.java:679)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at java.lang.reflect.Method.invokeNative(Native Method)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at java.lang.reflect.Method.invoke(Method.java:507)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at gnu.expr.PrimProcedure.apply(PrimProcedure.java:285)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at gnu.mapping.CallContext.runUntilDone(CallContext.java:234)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at gnu.mapping.CallContext.runUntilValue(CallContext.java:298)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at gnu.expr.GenericProc.applyN(GenericProc.java:120)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at gnu.kawa.reflect.Invoke.applyN(Invoke.java:193)
      05-13 11:18:03.521 E/AndroidRuntime(6021): at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)

      Elimina
    2. Forse hai dei file immagine troppo grandi, prova con un editor di immagini a salvare immagini più piccole o più compresse,
      poi se non chiudi lo screen precedente prima di aprire il nuovo puoi avere problemi di memoria come nel tuo caso.
      Dimmi anche che telefono usi, scrivimi anche te per email, la mail la trovi nei video facilmente :)
      ciao

      Elimina
    3. Inoltre, non ho capito come si chiudono gli screen

      Elimina
    4. Puoi vedere questo nuovo video https://www.youtube.com/watch?v=2vG4nAH39rw
      dove mostro come si può chiudere lo screen precedente dopo aver aperto il nuovo (guarda anche la parte 2)
      bisogna fare una mini procedura come mostrato qua:
      http://i.imgur.com/eXnQYCM.png

      per la mail la trovi guardando i video, quando sono collegato alla pagina di App Inventor 2 , in alto a destra , non la scrivo qui per evitare spam... :)

      Elimina
    5. Domattina provo a vedere se ci riesco. Sebastiano, non mi dire nulla, perdonami, ma non trovo da nessuna parte la tua mail.... :(

      Elimina
    6. Ciao Sebastiano, ho seguito la procedura ma ogni qualvolta premo il tasto "back" del mio smartphone per tornare indietro, l'applicazione si chiude. La mia applicazione è questa https://play.google.com/store/apps/details?id=appinventor.ai_antoniopecci89.dall

      Elimina
    7. Dipende da come l'hai implementata, se hai una sola schermata si chiude l'app, se invece vuoi ne puoi tenere una (la principale) aperta sempre e chiudere lo screen precedente solo nel caso vengano aperte nuove schermate.
      Il link del play store non mi interessa, ti consiglio di postare i blocchi che hai fatto sul forum (se vuoi), per la mail, guarda bene, anche altri video e vedi che la trovi...cmq non ci vuole un genio per "indovinarla..." :)

      Elimina
    8. Ho varie schermate principali, ho seguito la tua procedura. Purtroppo dopo 18 clik l'App va in crash, prima di seguire la tua procedura ne bastavano 12. Bene, ho tolto tutti gli sfondi e le immagini con dimensioni troppo grandi e questo è il catlog

      05-14 12:55:03.780 D/AndroidRuntime(2784): Shutting down VM
      05-14 12:55:03.803 E/AndroidRuntime(2784): FATAL EXCEPTION: main
      05-14 12:55:03.803 E/AndroidRuntime(2784): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
      05-14 12:55:03.803 E/AndroidRuntime(2784): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:482)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at com.google.appinventor.components.runtime.util.MediaUtil.decodeStream(MediaUtil.java:306)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at com.google.appinventor.components.runtime.util.MediaUtil.getBitmapDrawable(MediaUtil.java:296)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at com.google.appinventor.components.runtime.ButtonBase.Image(ButtonBase.java:318)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at java.lang.reflect.Method.invokeNative(Native Method)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at java.lang.reflect.Method.invoke(Method.java:507)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at gnu.expr.PrimProcedure.apply(PrimProcedure.java:285)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at gnu.mapping.CallContext.runUntilDone(CallContext.java:234)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at gnu.mapping.CallContext.runUntilValue(CallContext.java:298)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at gnu.expr.GenericProc.applyN(GenericProc.java:120)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at gnu.kawa.reflect.Invoke.applyN(Invoke.java:193)
      05-14 12:55:03.803 E/AndroidRuntime(2784): at gnu.mapping.ProcedureN.apply3(ProcedureN.java:48)

      Elimina
    9. Ciao Antonio, cancellerò tutti i messaggi con i tuoi log, capisci anche te che per gli altri lettori del blog servono a poco,
      io mi concentrerei su questo errore:

      java.lang.OutOfMemoryError: bitmap size exceeds VM budget

      purtroppo non ho trovato informazioni riguardanti quest'errore legato ad App Inventor, se non hai bisogno che la tua app vada anche in landscape prova a forzare l'orientamento solo in portrait

      ho trovato questo riguardo App Inventor

      https://groups.google.com/forum/#!topic/programming-with-app-inventor/YrSKrJ5zmDY
      e anche qui
      https://code.google.com/p/app-inventor-for-android/issues/detail?id=1057

      sembra un problema noto quando si hanno le immagini di background e si hanno troppi screen, però anche li dicono che se chiudi lo screen precedente dovresti risolvere, sicuro di fare tutto come ti ho spiegato?

      Elimina
    10. Va benissimo, sembra che il problema sia terminato. Ora ho un altro problema, come mai se salvo il file con un nome diverso non lo salva e si blocca?
      Antonio e grazie di cuore per quanto ti stai mettendo a disposizione

      Elimina