Italian Problemi con Bitmap

Star-Dust

Expert
Licensed User
Longtime User
Ho generato un piccolo codice per consentirmi di inserire una serie di Bitmap in una lista e successivamente popolare un Panel con una serie di Imageview contenenti le immagini inserite nella lista dei Bitmap.

Ho avuto molti problemi per passare il bitmap come parametro è assegnarlo a me una variabile, come vedete nella Sub Add, che ho rusolto con la Sub Add2. (Ma non so se è la soluzione più corretta)

Adesso ho problemi per passare dalla variabile Bitmap contenuta in una lista all'oggetto ImageView.

Vi allego il codice. Spero avrete suggerimenti. :(:(:(:(:(

B4X:
'Dichiarato in Global
type Item (Name as String, Bmp as Bitmap)
Dim L as list


Sub AddItem(Name as String, Bmp as Bitmap)
Dim NewItem as Item

NewItem.Name=Name
NewItem.Bmp=Bmp ' Genera Errore

L.Add(NewItem)
End Sub

Sub AddItem2(Name as String, Bmp as Bitmap)
Dim NewItem as Item

NewItem.Name=Name
Dim B2 as Bitmap
Dim Can as Canvas
Dim Rec1 as Rec

B2.InitializeMutable(40dip,40dip)
Can.Initialize2(B2)
Rec1.Initialize(0,0,40dip,40dip)
Can.DrawBitmap(Bmp,Rec1)

NewItem.Bmp=Can.Bitmap ' funziona

L.Add(NewItem)
End Sub

Sub DrawAll
Dim P as Panel

P.Initialize("")
Activity.AddView(P,0dip,0dip,40dip,100%y)

For I=0 L.Size-1
      Dim MyItem as Item = L.Get(I)
  
      Dim Bm as ImageView
  
      P.AddView(Bm,0dip,i * 40dip, 40dip,40dip)
  
      Bm.SetBackgroundImage(MyItem.Bmp) ' Va in errore
Next
End Sub

il codice è approssimativo tanto per dare un idea.

Perché DrawAll va in errore su Bm.SetBackgroundImage(MyItem.Bmp)?

Devo usare di nuovo Canvas ?
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ho letto un po' in fretta ma mi sembra che poni più di un quesito, anche all'interno del codice stesso.

Provo a capire, punto per punto, quale sia il problema principale ed i secondari.

Primo problema, nel codice, è che non hai inizializzato la variabile NewItem.
 

LucaMs

Expert
Licensed User
Longtime User
Il resto (ho già la testa confusa da altro) non lo capisco, perché nella descrizione dici di voler aggiungere delle immagini (bitmap) in un pannello ma non direttamente disegnate sul pannello, dentro delle ImageView; allora perché poi usi dei Canvas?

Ti basta creare ed aggiungere delle ImageView (magari direttamente nella AddItem) ed assegnare le bitmap a queste, con ImageViewX.Bitmap = bmp.
 

Star-Dust

Expert
Licensed User
Longtime User
Ho letto un po' in fretta ma mi sembra che poni più di un quesito, anche all'interno del codice stesso.

Provo a capire, punto per punto, quale sia il problema principale ed i secondari.

Primo problema, nel codice, è che non hai inizializzato la variabile NewItem.

Grazie per la tua risposta. Su Add2 funziona senza inizializzare ma solo se uso Canvas.

Se non uso Canvas va in errore, per questo motivo ho scelto di usarlo.

Ho dei motivi precisi per usare una lista di Bitmap e non creare gli oggetti ImageView direttamente.
Sto creando una classe CustomView per un nuovo Spinner.
Per passare i parametri di ogni item uso una sub e fra gi vari parametri passo una bitmap con un immagine, simile a una listView.
 

LucaMs

Expert
Licensed User
Longtime User
Se poi modifichi la lista delle bitmap e chiami di nuovo la DrawAll, beccherai un altro problema, il pannello sarà "duplicato".

Dovresti creare il pannello in un posto separato, al di fuori della routine DrawAll (e ovviamente prima che questa venga eseguita).

Nellla DrawAll rimuovi tutte le imageview prima di crearne di nuove (tutto questo sempre se DrawAll sarà chiamata più di una volta).
 

Star-Dust

Expert
Licensed User
Longtime User
Allora i confusi non due :D

1) Una variabile di tipo TypeX va sempre inizializzata, quindi dovrebbe darti errore anche nella Add2.

2) non hai inizializzato nemmeno la ImageView Bm (alla quale cambierei nome, visto che non è una bitmap, magari un semplice IV).

Nel codice originale l'ho inizializzare ImageView, questo codice che ho postato l'ho riscritto con lo smartphone e ha qualche mancanza :p:p

Provo a inizializzare la Tuo è , ma ti confermo che funziona con Canvas senza averla inizializzata ma non so il perché... :D:D:D:D:D:D:D:D
 

Star-Dust

Expert
Licensed User
Longtime User
Se poi modifichi la lista delle bitmap e chiami di nuovo la DrawAll, beccherai un altro problema, il pannello sarà "duplicato".

Dovresti creare il pannello in un posto separato, al di fuori della routine DrawAll (e ovviamente prima che questa venga eseguita).

Nellla DrawAll rimuovi tutte le imageview prima di crearne di nuove (tutto questo sempre se DrawAll sarà chiamata più di una volta).

Questo mi è gia capitato ieri notte durante una delle tante prove e ho risolto cosi come mi hai indicato anche tu. Il codice postato è approssimativo, sono fuori e quindi non posso portare quello originale
 

Star-Dust

Expert
Licensed User
Longtime User
Se poi modifichi la lista delle bitmap e chiami di nuovo la DrawAll, beccherai un altro problema, il pannello sarà "duplicato".

Dovresti creare il pannello in un posto separato, al di fuori della routine DrawAll (e ovviamente prima che questa venga eseguita).

Nellla DrawAll rimuovi tutte le imageview prima di crearne di nuove (tutto questo sempre se DrawAll sarà chiamata più di una volta).
Devo darti ragione su tutti i fronti. Inizializzando la variabile dichiarata Type, AddItem funziona correttamente, quindi ho tolto Additem2 che usava Canvas (Che per motivi misteriosi all'essere umano funzionava).

Seconda cosa che avevi ragione, ImageView sul codice originale non era stato inizializzato. Adesso funziona perfettamente. Sicuramente stanotte ero troppo intontito ... dimenticarmi di inizializzare ...:eek::eek::confused::confused:

Appena sarà completa la pubblicherò su Frammenti di codice.
 

Attachments

  • SD_Spinner.zip
    18.6 KB · Views: 281
  • Screen1.png
    Screen1.png
    30.2 KB · Views: 284
Top