Italian [B4A] Impostare un layout multiplo

Schakalaka

Active Member
Licensed User
Ciao a tutti.
spiego la mia necessità:

Ho creato un' app, però vorrei modificarne l' aspetto grafico, come background, colore testo di bottoni e label etc.

Che tipo di modulo posso utilizzare a tale scopo? ovvero, scrivere il codice qui, e attraverso una variabile globale, richiamata dopo il layout, cambiare velocemente i vari colori, senza modificarli manualmente uno ad uno.
Grazie
 

Sagenut

Expert
Licensed User
Longtime User
Ma intendi che hai, ad esempio, 10 Label e vuoi che diventino tutte uguali?
 

Schakalaka

Active Member
Licensed User
no, vorrei creare 3-4 layout, e poter scegliere o aggiungere velocemente. per layout intendo lo stile dell' interfaccia, tipo colore di sfondo, dimensione del carattere etc.
per esempio per poter inserire un modalità scura come su android studio
 

Sagenut

Expert
Licensed User
Longtime User
Non sono al PC e non posso fare prove.
Io farei delle sub dove imposti il colore del testo, dello sfondo e tutto.
Poi con dei For Each li applichi a tutte le Label, a tutti i Button e via dicendo.
È un'idea così al volo.
Una sub per il tema chiaro e una per il tema scuro.
 

Sagenut

Expert
Licensed User
Longtime User
Ecco un esempio.
Sicuramente migliorabile.
 

Attachments

  • Temi.zip
    9.9 KB · Views: 168

udg

Expert
Licensed User
Longtime User
Se sono poche combinazioni, perchè non salvi i 2-3 layout (immagino tutti uguali tranne la parte coreografica di colore,font..) e quando ne occorre la necessità rimuovi tutte le view dalla activity/pagina e cvarichi il nuovo layout?
Ovviamente i "componenti" avranno lo stesso nome su tutti i layout, altrimenti la parte di codice non funzionerebbe più..

Anche questa è solo un'idea. Va testata.
 

Sagenut

Expert
Licensed User
Longtime User
Se sono poche combinazioni, perchè non salvi i 2-3 layout (immagino tutti uguali tranne la parte coreografica di colore,font..) e quando ne occorre la necessità rimuovi tutte le view dalla activity/pagina e cvarichi il nuovo layout?
Ovviamente i "componenti" avranno lo stesso nome su tutti i layout, altrimenti la parte di codice non funzionerebbe più..

Anche questa è solo un'idea. Va testata.
Però in questo modo non si perdono i valori delle varie View?
Nel senso:
Nel layout le Label hanno il testo CIAO.
A runtime vengono impostate a BUONGIORNO.
Ricaricando il layout torna tutto a default.
Sbaglio?
Perché io ho capito che voleva fare un cambio dinamico (tipo Google Maps in navigazione che cambia di giorno e di notte), ma forse ho capito male io.
 

udg

Expert
Licensed User
Longtime User
Non sbagli affatto. Se è necessario salvare e ripristinare i valori si può anche fare. Non so quale sia il contesto di utilizzo. L'idea era semplicemente sul come fare rapidamente un cambio di look.
 

Sagenut

Expert
Licensed User
Longtime User
Non sbagli affatto. Se è necessario salvare e ripristinare i valori si può anche fare. Non so quale sia il contesto di utilizzo. L'idea era semplicemente sul come fare rapidamente un cambio di look.
Lo STATEMANAGER (che non ho usato e quindi non conosco) forse può aiutare in questo?
 

Sagenut

Expert
Licensed User
Longtime User
Nota che "Is Label" darà sempre True sia con Label, con TextView e con Button (ed altre, come la CheckBox).


P.S.
Non lo sapevo. Grazie
 

Star-Dust

Expert
Licensed User
Longtime User
Nota che "Is Label" darà sempre True sia con Label, con TextView e con Button (ed altre, come la CheckBox).


P.S.
E' vero solo in parte, perchè comunque è possibile distinguerli.
Perchè Button e TextField (non TextView che è un oggetto/classe Java) sono riconosciuti come Label, ma non viceversa. Una Label non è riconosciuta come Button, ne un Button come TexField. Stesso discorso in B4A.

Quindi ponendo opportunamente le condizioni "if " si possono facilmente distinguere. Ecco due esempi (con allegato). In questo esempio il confronto con la classe/oggetto Label che viene riconosciuto da tutti e tre le istanze degli oggetti, va sempre per ultimo, quindi ci arriva solo dopo aver scartato le altre possibilità.

Android:
Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")

    For Each Obj As Object In Array As Object (Label1,Button1,Label1,EditText1)
        Log(Obj)
        If Obj Is Button Then
            Log("BUTTON")
        else if Obj Is EditText Then
            Log("EDITEXT")
        Else if Obj Is Label Then
            Log("LABEL")
        End If
    Next
End Sub

B4X:
Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1")
    MainForm.Show

    For Each Obj As Object In Array As Object (Label1,Button1,Label1,TextField1)
        Log(Obj)
        If Obj Is Button Then
            Log("BUTTON")
        else if Obj Is TextField Then
            Log("EDITEXT")
        Else if Obj Is Label Then
            Log("LABEL")
        End If
    Next
End Sub

Cosi disposti danno i risultati giusti:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
android.widget.TextView{d78f06f V.ED..... ......ID 0,0-0,0 #3}
LABEL
android.widget.Button{9d1ce4d VFED..C.. ......I. 0,0-0,0 #2}
BUTTON
android.widget.TextView{d78f06f V.ED..... ......ID 0,0-0,0 #3}
LABEL
android.widget.EditText{3f87e67 VFED..CL. ......I. 0,0-0,0 #4}
EDITEXT
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **

Waiting for debugger to connect...
Program started.
Label@53467701[styleClass=label]''
LABEL
Button@281b2028[styleClass=button]'Click'
BUTTON
Label@53467701[styleClass=label]''
LABEL
TextField@590a1cd8[styleClass=text-input text-field]
EDITEXT

In iOS non è necessario, non fa questa confusione. Ci sono diversi codici di esempio nel forum che lo dimostrano.
 

Attachments

  • B4A_Test.zip
    9.2 KB · Views: 150
  • B4J_test.zip
    2.2 KB · Views: 138
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Aggiungerei che è possibile sapere che oggetto sia con il comando:
GetType (object As Object) As String
B4X:
Log(GetType(MyView))
if GetType(MyView)="android.widget.TextView" then ..... ' B4A
if GetType(MyView)="android.widget.Button" then ..... ' B4A
if GetType(MyView)="javafx.scene.control.Label" then ..... ' B4J
if GetType(MyView)="javafx.scene.control.Button" then ..... ' B4J

if GetType(MyView).IndexOf("Button")>-1 then ..... ' B4A o B4J
 
Last edited:

Schakalaka

Active Member
Licensed User
Grazie a tutti per le vostre idee e suggerimenti.
mi era venuta l' idea, di poter utilizzare il modulo "Localization" (per il multilingua), ed inserire le varie caratteristiche tipo il colore, all' interno del database sqlite, ma ho trovato conflitti di tipi.

Ho quindi risolto, creando un modulo di codice, con delle sub che richiamo in ogni activity, e per ogni sub le impostazioni per singolo layout

quando ho finito, aggiungerò anche un esempio.
 
Top