Italian Scrollview: inserire elementi tramite designer

coslad

Well-Known Member
Licensed User
Longtime User
salve a tutti

sto iniziando a familiarizzare con questo ambiente di sviluppo ed ho bisogno del vostro prezioso
aiuto.
Ho la necessità di inserire molte informazioni in una pagina, queste informazioni sono statiche , sono testo e qualche immagine.
L'unica soluzione che mi é venuta in mente é quella di usare uno scrollview, ma dovendo utilizzare una precisa formattazione vorrei riempire la scrollview tramite designer.
Le ho provate tutte ma non trovo il modo .
Popolare la scrollview dà codice in questo caso é molto dura e poi altrimenti il designer a cosa serve?

Grazie in anticipo a tutti


Inviato dal mio GT-I9100 con Tapatalk 2
 

coslad

Well-Known Member
Licensed User
Longtime User
Grazie per la risposta,ho provato ed in effetti è efficace, anche se personalmente avrei preferito che si potessero inserire direttamente i view dentro la scrollview.
Magari avere l`oggetto panel con caratteristiche di scroll.

Un altra differenza con il vb (correggetemi se ho capito male) è che posso dichiarare diverse view tutte con lo stesso nome, quindi decine di label tutte con lo stesso nome,anche questa caratteristica non é facile da mandare giù.

Ciao

Inviato dal mio GT-P7510 con Tapatalk 2
 

klaus

Expert
Licensed User
Longtime User
B4A and Android are different than VB.
You can define several views with different names but set the EventName the same for all these views. Set a different Tag property for each view and in the event routine with the Sender keyword you can check the Tag property to know what view raised the event.
You have an example in the Beginner's Guide chapter 3 Second program.

Best regards.
 

coslad

Well-Known Member
Licensed User
Longtime User
Grazie per la risposta .
Inizializzare diverse view con un solo evento ed usare poi ilsender è una cosa molto comoda , cosi' da non dover avere piu' la necessita' di creare array di view.
Non capisco pero' il seguente codice (pagina 137 de manuale):

For i = 0 to 9

Dim btn as button
Btn.Initializa("Btn")
...
....
next

Vengono creati 10 button con il nome btn?
Il compilatore non dovrebbe andare in errore perche' e' stato duplicato un nome di variabile ( o oggetto)?
 

Dominex

Active Member
Licensed User
Longtime User
Grazie per la risposta .
Inizializzare diverse view con un solo evento ed usare poi ilsender è una cosa molto comoda , cosi' da non dover avere piu' la necessita' di creare array di view.
Non capisco pero' il seguente codice (pagina 137 de manuale):

For i = 0 to 9

Dim btn as button
Btn.Initializa("Btn")
Btn.Tag = i
...
....
next

Vengono creati 10 button con il nome btn?
Il compilatore non dovrebbe andare in errore perche' e' stato duplicato un nome di variabile ( o oggetto)?

Non è così, il testo "Btn" è l'evento che tutti è 10 button hanno in comune, in questo modo inserendo il codice sequente ti permetterà di controllarli tutti.

B4X:
Sub Btn_Click
Dim send as button
send = Sender
Msgbox(send.Tag,"") 'questo ti mostra il button selezionato.
End Sub
 

coslad

Well-Known Member
Licensed User
Longtime User
Allora sto facendo confusione.
Normalmente il nome di un controllo è univoco, mentre il tag è opzionale.
L'istruzione dim assegna e crea una nuova variabile, di regola non si può dichiarare più volte la stessa variabile.
L'usare il sistema del tag differente per identificare il controllo é uno stratagemma.

Di fatto nell'esempio precedente se dopo il ciclo for next scrivessi btn.text="Prova"
A quale dei 10 button sarebbe assegnato il comando?
Non avuto la possibilitá di provare ma sono curioso di vedere cosa accade.



Inviato dal mio GT-P7510 con Tapatalk 2
 

Dominex

Active Member
Licensed User
Longtime User
Allora sto facendo confusione.
Normalmente il nome di un controllo è univoco, mentre il tag è opzionale.
L'istruzione dim assegna e crea una nuova variabile, di regola non si può dichiarare più volte la stessa variabile.
L'usare il sistema del tag differente per identificare il controllo é uno stratagemma.

Di fatto nell'esempio precedente se dopo il ciclo for next scrivessi btn.text="Prova"
A quale dei 10 button sarebbe assegnato il comando?
Non avuto la possibilitá di provare ma sono curioso di vedere cosa accade.



Inviato dal mio GT-P7510 con Tapatalk 2
Per fare maggiore chiarezza segui questo codice:
B4X:
For i = 0 To 9
   Dim Btn As Button 
   Btn.Initialize("Btn")
   Btn.Tag = i
   Btn.Text = "Pulsante " & i
   Activity.AddView(Btn,5%x,5%y+(9%y*i),90%x,10%y)
Next

Sub Btn_Click
   Dim send As Button
   send = Sender
   Msgbox(send.Tag,"") 'questo ti mostra il button selezionato.
End Sub

In questo caso il "controllo" Btn è temporaneo, nel senso che lo controlli solo all'interno della Sub dove l'hai creato, altrimenti andrebbe dichiarato nella Sub Globals. In VB questa cosa darebbe sicuramente errore, ma qui no... ...per fortuna, perché quando capirai come funziona troverai la cosa più semplice da usare. Il "tag." non è opzionale, è una sorta di variabile all'interno del "controllo", in questo caso ci aiuta a distinguere i bari button.

Se scrivessi btn.text="Prova" dopo il next verrebbe assegnato al button 9 (0-9), ovvero l'ultimo creato, il 10° de preferisci.

Prova il codice che ti ho mostrato, capirai meglio.
 

GaNdAlF89

Active Member
Licensed User
Longtime User
@coslad
è come quando in vb dichiari una matrice di button, tutti con lo stesso nome ma identificati univocamente tramite l'index; devi considerare il tag di android proprio come l'index di vb. stesso discorso per le routine..
 
Last edited:

coslad

Well-Known Member
Licensed User
Longtime User
Ok , grazie
ho capito il concetto , anche se lo trovo da un lato pratico ma dall'altro limitativo .
Per esempio se facessi la stessa cosa con delle label e poi ho la necessità di cambiare qualche parametro , tipo testo o colore , come dovrei fare?
Dovrei scansionare tutte le label dell'activity e quando trovo quella con il tag corrispondente eseguo l'operazione.
Devo abituarmi a questo nuovo sistema.

Grazie ancora
 

coslad

Well-Known Member
Licensed User
Longtime User
un attimo, sé le dichiaro global come faccio a puntare ad esempio alla seconda label sé non interrogando ogni view e incrociando il nome ed il tag ? Direttamente non si può cambiare ad esempio il valore text perché tutte si chiamano label1. Intendo che sé scrivi label1.text ="prova" si modificherà il text dell' ultima dichiarata e non di quella desiderata. Ti prego di correggermi sé sbaglio.

Inviato dal mio GT-I9100 con Tapatalk 2
 

coslad

Well-Known Member
Licensed User
Longtime User
Infatti questo é il modo corretto di fare, ma l'oggetto del discutere era che dichiarare in loop 10 label non indicizzate ma tutte con lo stesso nome fosse una pratica utile, tipo

For t =0 to 9
Dim label1 as label
label1.text = "label " & t
next

a questo mi riferivo,sicuramente sono crudo di b4a ecco perche mi sembra poco produttivo usare questa tecnica,invece molto produttiva inizializzare diversi controlli (view) con lo stesso. "event name"


Inviato dal mio GT-P7510 con Tapatalk 2
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
dipende sempre dell'uso che ne devi fare.
Io trovo molto comodo ciclare le view ed impostare per ognuno le proprietà.
Ad esempio quando devo popolare in uno scroll dei dati prelevati da un database,
Perciò ciclo il cursor ed identifico le view in questo modo:
B4X:
lblNumero(x).TextColor=Colors.Red

dove x è la variabile del ciclo.
Fuori dal ciclo avrò :
B4X:
Dim lblNumero(nrec) As Label
Dove nrec è il record count totale dei dati da visualizzare.
 

Ennesima77

Member
Licensed User
Longtime User
Salve a tutti, mi intrometto nella discussione portando un mio piccolo approccio all'uso dello scrollview:
Inizialmente anche io ho avuto difficoltà a capire comegenerare correttamente uno scroll view che prendeva dei datida un DB e addirittura c'erano delle immagini.
Mi sono ricordato di alcune lezioni del mio prof di informatica che mi diceva sempre
"anche se la funzione è piccola e ti serve una sola volta separala dalle altre"
Allora ho pensato di isolare la funzione che creava il panel e passargi i parametri che mi servivano per popolarla correttamente (con il codice si capisce meglio):

B4X:
Sub CreaPannello(TAG as object, Img as bitmap, Record as Cursor) as Panel
      Dim pnlLevelTMP As Panel 
   
   Dim lblOrder As Label 
   Dim LabelW As Int : LabelW = 30
   Dim TextH, TextW As Int : TextW = 100 : TextH = 40
   Dim txtNome, txtCognome..... As EditText
   Dim bttCancella As Button 
   Dim ivFoto as ImageView

   pnlLevelTMP.Initialize("pnlLevel")
   pnlLevelTMP.Tag=IDPanel
      
   lblOrder.Initialize("lblOrder")
   pnlLevelTMP.AddView(lblOrder,5dip,5dip,LabelW,Main.BLabelH)
   lblOrder.TextSize=Main.BLabelFS
........... 'Non scrivo tutto perchè è un papiro di roba pauroso tanto il concetto di come 
            0'creare il pannello singolo è abbastanza semplice.
end sub

Sub RiempiListaClienti

Dim Table As Cursor
   Table = Main.SQLDB.ExecQuery("Select * from clienti")
   
   ClearClienti()

For i = 0 To Table.RowCount - 1
      Table.Position=i
      Dim PanelTMP As Panel 
      PanelTMP=LevelDesign(Table.GetInt2(0),PanellCount, Table)
      svLevel.Panel.AddView(PanelTMP,0,(PanellCount-1)*PanellH ,svLevel.Width, PanellH)
      PanellCount=PanellCount+1
   Next
end sub

In pratica si astrae il concetto di pannello e di matrice, ogni pannello (e di conseguenza ogni oggetto da esso contenuto) è una entità assestante e non necessita di essere dichiarata separatamente. Inizialmente avevo commesso l'errore di dichiare i vari oggetti (label, edittext etc.) in global, però facendo così ogni volta che chiamavo la funzione cambiavo il valore d tutti i precedenti oggetti in quanto erano visibili dall'intera activity e cliccando ad esempio su un bottone diuno dei pannelli in realtà leggevo e operavo sempre e solo sull'ultimo inserito.

Il Tag può essere anche un oggetto ad esempio il panel stesso, io preferisco l'uso di id numerici per comodità ed ho usato l'ID del db SQL del record come TAG dei vari oggetti, in questo modo era anche semplice ad esempio fare in modo che nella sub focus si riuscisse ad aggiornare subito il valore nel db
B4X:
Sub txtNome_FocusChanged (HasFocus As Boolean)
   
   If HasFocus =False Then
      
      Dim WhereMap As Map, Send As EditText 
      Send = Sender
      WhereMap.Initialize 
      WhereMap.Put("id",Send.tag )
      DBUtils.UpdateRecord(Main.SQLDB,TabellaClienti,"Name",Send.Text ,WhereMap)
      
   End If
   
End Sub

Lo stesso vale per i bottoni immagini etc.
Per l'aggiornamento o modifica di una proprietà (il testo di una label o il colore di fondo del pannello specifico) da altra sub su uno specifico pannello non ho ancora provato a farlo, ma credo diventi più complicato da gestire senza le matrici appena provo vi dico.
 
Last edited:

Ennesima77

Member
Licensed User
Longtime User
Condivido,
a questo punto se vogliamo farla bene , possiamo usare direttamente una classe, di modo che possiamo riutilizzarla anche negli altri progetti.:sign0060:

Concordo, sopratutto se poi quella medesima funzione può servire a più activity del programma.
P.S: a proposito di sub in classi e activity vi chiedo un chiarimento:
come mai non si può chiamare una funzione in una activity da altre activity passando dei parametri, cosa che invece nelle classi è possibile?
Mi spiego meglio:
Dalla Activity2 devo richiamare una funzione nella Activity1 che però richiede il passaggio di un valore qualsiasi ad Esempio Caricacliente(Id as int).

PPS: stò sviluppando un programma abbastanza particolare ed avrei bisogno di una mano dato che è molto complessa, qualcuno sarebbe disposto ad aiutarmi, ovviamente con un compenso, se mi contattate in PVT vi spiego tutto.
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Hai provato con :
B4X:
CallSub3 (Component As Object, Sub As String, Argument1 As Object, Argument2 As Object) As String

Esempio:
B4X:
dim sMessaggio as string
sMessaggio =CallSub3 ("activityTwo", "submostra", "Viva ", "B4A")
Questa è la sub messaggio:
B4X:
submostra(parola1 as string,parola2 as string)
 return parola1 & parola2
end sub

Ciao
 
Top