Italian Interrogare lo stato dello switch (o dello spinner) di una riga

Vasmar

Member
Licensed User
Buonasera,
Grazie alle indicazioni e all'esempio datimi ho semplificato molto il programma. La pagina viene costruita con una riga con spinner, una riga con B4Xswitch e altre righe con delle Imageview.
Sono riuscito ad acquisire la riga dello spinner sulla quale l'utente clicca, ma non riesco a testare in quale stato è il B4xSwitch. Anche il semplice test sullo stato Enabled/disabled manda il programma in crash.
Come posso fare?
Grazie.



Private Sub ClvElenco_ItemClick(Index As Int, Value As Object)
Dim p As B4XView = ClvElenco.GetPanel(Index) 'Crea un riferimento al panel cliccato, INDEX contiene il suo numero
Dim nome As String = p.GetView(1).Text 'Crea una stringa con il contenuto della Label con il nome
Log("Get1 Index " & Index & ", Value " & Value & ", Txt " & nome)

If Index = 0 Then
Dim appos As Spinner = p.GetView(2)
Log("spinnerItem (" & appos.SelectedIndex & ") " & appos.SelectedItem)
End If

If Index = 1 Then ' Questo contiene il B4XSwitch
Dim appo As B4XSwitch = p.GetView(2)
Log("Stato " & appo.Enabled) ' Qui va in crash
End If

End Sub
 

Sagenut

Expert
Licensed User
Longtime User
Se è l'unico Switch con quel nome in tutta la pagina ti basta leggere le sue proprietà usando il suo nome direttamente.
L'aver composto la calcolatrice con vari pezzi inseriti in una CLV è singolare.
Avrei fatto un unico layout.
Se comunque ogni view ha un nome univoco puoi interrogare tutto direttamente.
Interrogare le view, in questo caso, quando clicchi sul relativo elemento della CLV mi pare inutile.
Più probabile che tu abbia bisogno di interrogare lo stato di qualunque view in qualunque momento.
Generalmente una CLV viene usata per inserire tanti elementi tutti uguali, tipo una lista di oggetti di un magazzino con prezzi e disponibilità.
Allora in quel caso hai bisogno di creare riferimenti alle view specifiche del panel cliccato perché ogni elemento ha le stesse view con gli stessi nomi.
 

Vasmar

Member
Licensed User
Se è l'unico Switch in tutta la pagina ti basta leggere le sue proprietà usando il suo nome direttamente.
Hem, in realtà gli switch sono due, ognuno su una riga diversa, con lo stesso layout.

L'aver composto la calcolatrice con vari pezzi inseriti in una CLV è singolare.
Quella non è la calcolatrice, ma la pagina per settare i parametri: Lingua, colori, suono...
 

Sagenut

Expert
Licensed User
Longtime User
If Index = 1 Then ' Questo contiene il B4XSwitch
Dim appo As B4XSwitch = p.GetView(2)
Log("Stato " & appo.Enabled) ' Qui va in crash
End If
Per quanto riguarda l'errore qui........ Servirebbe avere la lista del messaggio di errore per capire cosa ti sta indicando l'ide.
Per postare codice utilizza l'icona
</>
che trovi in alto nella finestra dove scrivi il messaggio e incolla il codice nella nuova finestra che ti verrà mostrata.
 

Vasmar

Member
Licensed User
In effetti l'IDE mi segnala sulla riga
B4X:
Dim appo As B4XSwitch = p.GetView(2)
che "i tipi non corrispondono"...

Le righe sono moltissime, ma credo che le indicazioni utili stiano all'inizio

Errore:
Call B4XPages.GetManager.LogEvents = True to enable logging B4XPages events.
** Activity (main) Resume **

Error occurred on line: 181 (Parm)
java.lang.RuntimeException: Field: ba not found in: anywheresoftware.b4a.BALayout
    at anywheresoftware.b4a.shell.Shell$FieldCache.getField(Shell.java:923)
    at anywheresoftware.b4a.shell.Shell.getField(Shell.java:697)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:360)
.....
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
Posta l'immagine della lista delle views di quel layout, perché sembra che tu non stia puntando allo switch.
 

Vasmar

Member
Licensed User
Non capisco bene cosa intendi... dici questo che è nel modulo?
B4X:
Sub Class_Globals
    Public Root As B4XView 'ignore
    Private xui As XUI 'ignore
    
    Private Byme As B4XView
    Private Sfondo As B4XView
    Private Titoletto As B4XView
    Private Titolo As B4XView
    Private ClvElenco As CustomListView
    Private BUsci As B4XView
    Private BConf As B4XView
    
    Private LbDeRip As Label    
    Private LbRip As Label
    Private RbRip As B4XSwitch   ' <=== La vista di cui parliamo
 

Sagenut

Expert
Licensed User
Longtime User
Nel Designer apri il layout della riga con lo switch e posta il views Tree che trovi a sinistra con la lista delle view di quel layout.
 

Vasmar

Member
Licensed User
Questo
 

Attachments

  • Img per RbRip.jpg
    Img per RbRip.jpg
    51.1 KB · Views: 26

Sagenut

Expert
Licensed User
Longtime User
Non sono al PC ma a te credo che serva la proprietà Value per sapere lo stato dello switch.
 

Sagenut

Expert
Licensed User
Longtime User
Aspetta, prova così
B4X:
Dim appo As B4XSwitch = p.GetView(2).Tag
 

Vasmar

Member
Licensed User
😯
Funziona, complimenti!
faccio il GetView.Tag e poi il log della Value e mi dà True o False a seconda di come sta lo switch.
Grazie, credo che ci siamo guadagnati (molto più tu, ma vabbè) una bella dormita.
Buona notte.
 

Sagenut

Expert
Licensed User
Longtime User
Io ho il turno di notte, altro che dormita.
Buonanotte
 

Sagenut

Expert
Licensed User
Longtime User
La soluzione comunque è che le CustomView, non le view native, contengono il riferimento a se stesse nella proprietà Tag.
 

LucaMs

Expert
Licensed User
Longtime User
Top