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.
- Open another screen non fa altro che aprire il nuovo schermo, dobbiamo dare il nome esatto dello schermo così come indicato in design editor
- 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)
- get start value si usa nello schermo di "destinazione" per leggere il valore eventualmente passato
- close screen - chiude lo schermo corrente (e torna allo schermo precedente se esiste, altrimenti chiude l'app
- 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:
Ciao,
RispondiEliminaintanto 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.
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 :)
Eliminaspero capiate anche queste esigente,io do l'idea generale poi gli "affinamenti" stanno a voi ;)
Grazie infinite guida fatta benissimo!! Io ho una domanda non inerente al multi-screen, non sapendo dove scriverla la metto qui:
RispondiEliminaC'è 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!!!!!
Nuib,quello che chiedi non è semplice da realizzare,tutto (o quasi) si può fare...
RispondiEliminaper 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)
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.
EliminaSe 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
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.
EliminaSi 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...
Interessantissimo non conoscevo SlideMe buono a sapersi!! Fantastico allora speriamo che arriverà presto questo tutorial!
EliminaSalvo, 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:)
RispondiEliminaAltra domanda: per usare l'activitystarter esiste un elenco di tutte quelle disponibili per android? O devo mettere il cellulare in debug mode?
RispondiEliminanon esiste un elenco completo, uno parziale lo trovi alla pagina di app inventor:
Eliminahttp://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!
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.
RispondiEliminaSe non sono stato molto chiaro chedetemi pure.
Grazie
Ciao,
Eliminaper 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
Confermo tutto in merito ai problemi con file grossi.
EliminaEh 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.
RispondiEliminaCerto che dopo tutto questo sbattimento per trovare il modo di mettere gli ads ora ci segano le gambe in questo modo...non ho parole :)
Molto interessante, proverò sicuramente, fammi avere subito notizie quando ti hanno attivato e se riesci a integrarlo bene con AI :)
RispondiEliminaSecondo te è possibile cancellare la cache dei dati di un applicazione con un bottone ed un activity starter?
RispondiEliminaComunque ci vuole un forum in questo blog...ormai è indispensabile! :-P
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...
EliminaPer 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?
io proverei con questo:
Eliminahttp://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.
Grazie infinite VeSaDev! messo nei preferiti,tra i buoni propositi per i prossimi aggiornamenti sicuramente quello di implementare finalmente il forum!!! :)
Eliminaciao 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
RispondiEliminaNon credo sia necessario un tutorial devi solo trovare lo stream mp3 e darlo come indirizzo al componente player
EliminaAd ogni modo se hai difficoltà scrivimi per mail e ti spiego meglio
Salvo, funziona proprio così solo che lo stream deve essere mp3, e non tutti vanno...
Eliminabenissimo 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!
RispondiEliminaciao, 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.
RispondiEliminaPer 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
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.
Eliminaciao aa tutti, chiedo sopratutto a salvo, io mi sono registrato ma non ho capito, come si integra la cosa... ideee??
RispondiEliminaPerdona seba la mia ignoranza, ma non riesco a capire quali tasti devo premere per copiare blocchi..
RispondiEliminaCiao 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)
RispondiEliminaCiao ragazzi, io sto realizzando un app con multi screen ma ho un problema:
RispondiEliminail 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??
purtroppo secondo me c'è un baco in AI perchè il close screen di fatto non funziona.
EliminaPer 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 :)
Come hai fatto ad impostare un tempo per spostarti da uno screen ad un altro?
EliminaBasta impostare un clock e cambiare screen nel momento in cui l'evento clock1.timer viene generato
Eliminaciao Seba, senti nel multiscreen c'è la possibilità di passare una immagine da uno screen all'altro??se si, come si fa??
RispondiEliminapuoi passare solo valori testuali
Eliminaperò 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
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? :(
RispondiEliminail 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?
Eliminadevi 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
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
RispondiEliminaAndrea
Per il multiscreen devi per forza scaricare l'apk sul telefono, da emulatore non va
Eliminacon i miei sorgenti ti funziona?
Non funziona nemmeno sul cell...
Eliminala 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
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 ;)
RispondiEliminal'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.
EliminaPer 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
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
RispondiEliminaCiao 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.
EliminaA 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
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 ?
RispondiEliminaCerto che si può fare, hai due strade percorribili:
Elimina1 - 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
Grazie!! ci sono riuscito col primo metodo.
EliminaMa cosa stò sbagliando???
Eliminaa 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
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...
Eliminamagari è un errore banale di sintassi, io imposterei delle label giusto per il debug ... :)
Ciao Sebastiano, complimenti vivissimi per il blog.
RispondiEliminaFatto 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...
Nessun problema, figurati,
Eliminain 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 :)
Ciao Sebastiano
RispondiEliminaDa 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
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...
Eliminauna 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 :)
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
RispondiEliminaPuoi usare la funzione random per far uscire un numero, diciamo da 1 a 5 se hai 5 screen,
Eliminacrei 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... :)
Ciao sebastiano complimenti per le guide e tutti i tuoi utilissimi suggerimenti.
RispondiEliminaAvrei una domanda: sto creando un app con screen molto "lunghi" che avrei bisogno si aprissero ad un altezza precisa...è possibile?
Grazie
Ciao, devi ovviamente lasciare la spunta su "scrollable" dello schermo e poi inserire un vertical arrangement con altezza fissata in xx pixel,
Eliminapurtroppo 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...
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.
RispondiEliminagrazie in anticipo
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.
EliminaPer 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.
scusa seba, ma non ho capito bene le ultime due righe!! potresti spiegarmi molto dettagliatamente, sono alle prime armi!!
EliminaIntanto in ogni screen metti un elemento "TinyDb",
Eliminase 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!
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?
Eliminasi, 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
Eliminaperfetto, gentilissimo, alla prossima!!
EliminaCiao 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).
RispondiEliminaGrazie mille!!
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
RispondiEliminaIo ho dovuto riavviare il dispositivo prima di veder comparire la cartella da me creata.
perfetto,quindi mi basterà mettere nel blocco (canvas1.SaveAs) un text con scritto (/mnt/sdcard/MypersonalPhoto/canvas1.png).
Eliminasi ma poi ti troverai davanti a un problema: il secondo disegno che salverai si chiamaerà sempre canvas1.png
RispondiEliminaquindi 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
il secondo canvas lo salverò con il nome canvas2.png, perchè dovrebbe chiamarsi canvas1.png?
RispondiEliminanel 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?
ringrazia l'altro "seb" per le ottime risposte! :)
Eliminaad 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
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!!
EliminaQuando 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"
Eliminapoi visualizzi questo contatore nella tua textbox
devo fare una schermata con una ventina di canvas e al suo interno deve girare 4 immagini.png.
Eliminaconviene fare 20 variabili,cioè una per ogni canvas?
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
Eliminaok ok, scusami avevo capito male...
RispondiEliminaCiao 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?
RispondiEliminaCiao Manuel
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
EliminaSi, è 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.
EliminaCiao, notte, Manuel
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!!
RispondiEliminaGrazie mille!
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
EliminaQui 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à
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!!
RispondiEliminaDimenticavo 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?!?!
EliminaPer 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,
Eliminatali 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 :)
scusa mi ha tagliato i tag che sono questi:
Elimina...supports-screens android:resizeable="True" android:smallScreens="True" android:normalScreens="True" android:largeScreens="True" android:anyDensity="False"/...
(al posto dei ... devi mettere < e >)
Ok appena ho una mezz'oretta di tempo proverò a fare come mi hai detto!! Grazie!!
EliminaPerfetto il numero di dispositivi non compatibili è sceso a 33, numero più che accettabile !!! Grazie!!
EliminaCiao, sai per caso come far funzionare un app in background? e possibile farlo con app inventor?
RispondiEliminal'unico componente che funziona anche in background è il componente "texting" e si può utilizzare per attivare l'app all'arrivo di un sms.
EliminaTutti gli altri componenti lavorano solo se l'applicazione è attiva e in primo piano
Mi sapresti dire come faccio a far attivare l' app all' arrivo di un sms con activitystarter?
Eliminanon si usa activitystarter ma il componente "texting" , ne devi aggiungere uno alla tua app, da design editor imposta la proprietà ReceivingEnabled su "always"
Eliminain 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)
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
RispondiEliminache 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...
EliminaCiao, davvero molto utile come tutorial, però ho un piccolo problema e ti pongo il quesito seguente:
RispondiEliminaHo 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?
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!
EliminaCiao, 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.
RispondiEliminabasta che cambi l'icona della tua applicazione,
Eliminacarica un immagine 128x128 o 512x512 con il logo della tua app da design editor alla voce "icon"
Ciao Sebastiano grazie per i tuoi tutorial sono fantastici! Chiari e ben spiegati.
RispondiEliminaVolevo 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
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 ...
RispondiEliminano, non è possibile con le versioni gratuite di App Inventor, mi dispiace
Eliminase 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!
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.
RispondiEliminaSe 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
Dovrebbe funzionare, hai scritto i nomi degli screen correttamente (maiuscole/minuscole?)
EliminaSu 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...
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
EliminaCiao :) ma nel caso in cui avessi tanti suoni e volessi fermarli tutti con un solo pulsante qual'è la giusta procedura da inserire??
RispondiEliminaDipende 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.
EliminaCiao 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
RispondiEliminaIn 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
05-13 11:18:03.521 E/AndroidRuntime(6021): FATAL EXCEPTION: main
Elimina05-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)
Forse hai dei file immagine troppo grandi, prova con un editor di immagini a salvare immagini più piccole o più compresse,
Eliminapoi 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
Inoltre, non ho capito come si chiudono gli screen
EliminaPuoi vedere questo nuovo video https://www.youtube.com/watch?v=2vG4nAH39rw
Eliminadove 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... :)
Domattina provo a vedere se ci riesco. Sebastiano, non mi dire nulla, perdonami, ma non trovo da nessuna parte la tua mail.... :(
EliminaCiao 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
EliminaDipende 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.
EliminaIl 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..." :)
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
Elimina05-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)
Ciao Antonio, cancellerò tutti i messaggi con i tuoi log, capisci anche te che per gli altri lettori del blog servono a poco,
Eliminaio 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?
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?
EliminaAntonio e grazie di cuore per quanto ti stai mettendo a disposizione
Ciao Sebastiano, complimenti per il blog, molto utile e tu molto bravo nelle spiegazioni, vorrei chiederti un'informazione su questo argomento (multiscreen) ma vedo che i commenti sono molto vecchi..Rispondi ancora?
RispondiEliminaGrazie, si ci provo a stare dietro a tutti i commenti...ma non è sempre facile...
EliminaCmq prova a chiedere vediamo se riesco a trovare il tempo per darti una mano :)
Ti ringrazio tantissimo anche perché non so più dove sbattere la testa e i tuoi tutorial li ho guardati tutti ormai :)
EliminaAllora...ho creato un app multiscreen per la mia piccola attività (un' agenzia immobiliare), funziona, ma dopo un po' di passaggi da una schermata all'altra va in crash, mi da un arresto forzato. Ho rivisto tutti i blocchi diverse volte ma non capisco quale sia il problema, non ci arrivo proprio. Ho usato il sistema "goToscreen" come nel tuo tutorial, i blocchi sembrano giusti ma evidentemente in qualcosa sbaglio, eppure continua a sembrarmi tutto ok. Ti posso mandare il file?Ci potresti dare uno sguardo?
O magari se hai già in mente quali potrebbero le possibili cause mi do da fare :)
EliminaNon so se hai già controllato, ma il punto è che devi essere sicuro di chiudere lo screen precedente dopo che hai aperto quello nuovo, altrimenti l'app occuperà troppa memoria ed andrà in crash prima o poi.
EliminaTi allego i blocchi di un semplicissimo progetto multiscreen (fatto con AI2 , nota che questo tutorial è per AI1 quindi alcune info in questo tutorial potrebbero essere superate)
http://i.imgur.com/3lgAUvb.png
altro non mi viene in mente
Mi sono "ispirato" proprio a quel tutorial che mi hai indicato e ho fatto esattamente così, per questo non capisco dove sbaglio. Nella mia ignoranza ho pensato che magari non avendo utilizzato alcun tinyDB magari perde dei dati e si incasina...ma non mi pare che serva salvare qualcosa per come è fatta l'app... :((
EliminaHo provato anche a mettere un button per tornare indietro anzichè utilizzare la funzione del cell ma stesso problema :(
Eliminase vuoi mandami l'app a seblogapps "at" gmail.com
Eliminami sembra molto strano quello che mi dici...
Mandata :)
EliminaSalve vorrei sapere se possibile avviare l'applicazione dallo screen 2
RispondiEliminaNo, non è possibile, tutte le app partono sempre da Screen1.
EliminaSe vuoi puoi subito passare a Screen1 con un blocco che fa aprire Screen2 appena apri Screen1 , però non te lo consiglio, ti consiglio invece di modificare la tua app e mettere le cose che vuoi siano accessibili subito nello screen "Screen1"
Ciao, ottimi tutorial i tuoi. Vorrei chiederti una cosa, come posso mantenere attiva la connessione bluetooth passando da una screen all'altra?
RispondiEliminaSe cade la connessione BT al passaggio degli screen mi sa che l'unica soluzione è quella di usare il "vecchio" metodo del multiscreen, ovvero creare tanti vertical arrangement da rendere poi visbili/non visibili tramite blocks editor.
EliminaIn questo modo in realtà usi un solo screen, è un pò più "macchinoso" da programmare ma la connessione BT resta attiva sicuramente.
Ciao, complimenti per il blog, mi è molto utile. Posso chiederti un aiuto?
RispondiEliminaSto creando un'app/giochino interattivo, con molti screen e vorrei salvare i progressi automaticamente, per fare in modo che alla riapertura dell'app chi gioca possa ricominciare da dove aveva lasciato. Ad esempio se chiudo l'app allo screen 5 quando la riapro vorrei cominciare dallo screen 5 e non da capo. è possibile una cosa del genere? Ho visto vari tutorial in giro ma nessuno che spieghi come fare per la mia situazione. Grazie se risponderai.