French Est -t-il possible d'utiliser le theme HoloEverywhere avec B4A?

alan1968

Active Member
Licensed User
Longtime User
petit probleme dans un menu déroulant basé sur "actionlist" avec b4a 2.0 et 2.2

Bonjour
j'ai utilisé comme base un exemple d'erel (action list) pour faire mon menu déroulant pour choisir des éléments dans mon application sous b4a 1.8 cela fonctionne correctement mais sous 2.0 et 2.2 je n'ai plus la ligne sélectionnée qui passe en orange et ma selection ne se fait pas

le code d'origine d'erel fonctionne lui sous 2.0 et 2.2

voici le code modifier pour mon cas

je ne vois pas où est le problème

hors mis le core,j'utilise les librairies Animation 1.02 et dialogs 2.70

B4X:
'Activity module
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.
Type ActionItem (Text As String, Image As Bitmap, Value As Object)
   Type ActionList (Pnl As Panel, Canvas As Canvas _
      ,Actions As List _
      ,Visible As Boolean _
      ,Title As String _
      ,InAnimation As Animation _
      ,OutAnimation As Animation _
      ,Selected As Int _
      ,ActivityName As String _
   )
   Dim fact As Float:fact=1
   Dim ItemHeight As Int : ItemHeight = 60*fact
   Dim TextSize As Float : TextSize = 20 'NOT dip.
   Dim TextLeftPos As Int : TextLeftPos = 70*fact
   Dim TextColor As Int : TextColor = Colors.White
   Dim TopPadding As Int : TopPadding = 5*fact
   Dim ImageWidth As Int : ImageWidth = 50*fact
   Dim ImageHeight As Int : ImageHeight = 50*fact
   Dim ImageLeftPos As Int : ImageLeftPos = 10*fact
   Dim ImageTopPos As Int : ImageTopPos = (ItemHeight - ImageHeight) / 2
   Dim SelectionColor As Int : SelectionColor = 0xFFFF8000
   ''
   Dim selection As Int
   Dim change As Boolean
End Sub

Sub Globals
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.
Dim al As ActionList
Dim scroll As ScrollView
Dim cd As CustomDialog2 
End Sub

Sub Activity_Create(FirstTime As Boolean)
   'Do not forget to load the layout file created with the visual designer. For example:
   'Activity.LoadLayout("Layout1")
change=True
mnuitems
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
Sub mnuitems'_click
If change= True Then
al =InitializeList(77%x, "SELECT ITEM + OK", "Main")
   AddActionItem("Bargraph", LoadBitmap(File.DirAssets, "mn_bargraph.png"), 17)
   AddActionItem("Bit label", LoadBitmap(File.DirAssets, "mn_label01.png"), 20)
   AddActionItem("Call page", LoadBitmap(File.DirAssets, "mn_page.png"), 14)
   AddActionItem("Cam ip", LoadBitmap(File.DirAssets, "mn_cam.png"), 18)
   AddActionItem("Classic button", LoadBitmap(File.DirAssets, "mn_bpn.png"), 2)
   AddActionItem("Fix label", LoadBitmap(File.DirAssets, "mn_label.png"), 0)
   AddActionItem("Flap", LoadBitmap(File.DirAssets, "mn_volet.png"), 8)
   AddActionItem("Galvanometer", LoadBitmap(File.DirAssets, "mn_galva.png"), 15)
   AddActionItem("Gauge", LoadBitmap(File.DirAssets, "mn_gauge.png"), 6)
   AddActionItem("Graph button", LoadBitmap(File.DirAssets, "bp_on.jpg"), 1)
   AddActionItem("Message", LoadBitmap(File.DirAssets, "mn_message.png"), 19)
   AddActionItem("On/off toggle button",LoadBitmap(File.DirAssets, "mn_tooglebp.png"), 3)
   AddActionItem("Oscilloscope", LoadBitmap(File.DirAssets, "mn_oscillo.png"), 16)
   AddActionItem("Picture", LoadBitmap(File.DirAssets, "mn_pic.png"), 10)
   AddActionItem("Receiver", LoadBitmap(File.DirAssets, "mn_recept.png"), 4)
   AddActionItem("Scenario", LoadBitmap(File.DirAssets, "mn_scenario.png"), 13)
   AddActionItem("Seekbar", LoadBitmap(File.DirAssets, "mn_seekbar.png"), 7)
   AddActionItem("Variable button", LoadBitmap(File.DirAssets, "mn_bpvar.png"), 11)
   AddActionItem("Variable label", LoadBitmap(File.DirAssets, "mn_labelvar.png"), 5)
   AddActionItem("Variable text", LoadBitmap(File.DirAssets, "mn_txtvar.png"), 9)
   AddActionItem("Web page", LoadBitmap(File.DirAssets, "mn_web.png"), 12)
   '
   Show
   
   Else
   ToastMessageShow("No edit mode !",False)
   End If
   End Sub
   Sub ActionList_Touch (Action As Int, X As Float, Y As Float) As Boolean
   'Delegates the touch event to the code module
   Touch(Sender, Action, X, Y)
   Return True
End Sub
Sub ActionList_Result (ReturnValue As Object)
   selection =ReturnValue
   End Sub 

Sub InitializeList (Width As Int, Title As String, ActivityName As String) As ActionList
   al.Initialize
   al.Actions.Initialize
   scroll.Initialize( (TopPadding + ItemHeight)*21)
   scroll.Panel.Height = (TopPadding + ItemHeight)*21
   Dim bmp As Bitmap
   bmp.InitializeMutable(Width, (TopPadding + ItemHeight)*21)
   al.Canvas.Initialize2(bmp)
   al.Pnl.Initialize("ActionList")
   al.Pnl.Tag = al
   Dim bd As BitmapDrawable
   bd.Initialize(bmp)
   bd.Gravity = Bit.Or(Gravity.LEFT, Gravity.TOP)
   al.Pnl.background = bd
   al.Title = Title
   al.InAnimation.InitializeAlpha("", 0, 1)
   al.InAnimation.Duration = 300
   al.OutAnimation.InitializeAlpha("", 1, 0)
   al.OutAnimation.Duration = 200
   al.ActivityName = ActivityName
   al.Selected=-1
   Return al
End Sub

Sub AddActionItem(Text As String, Image As Bitmap, ReturnValue As Object)
   Dim item As ActionItem
   item.Initialize
   item.Text = Text
   item.Image = Image
   item.Value = ReturnValue
   al.Actions.add(item)
End Sub

Sub Show 
Dim ret As Int
   'list_add =True
   cd.AddView(scroll,77%x, 60%y)
   If al.Visible Then 
      al.InAnimation.stop(al.Pnl)
      al.Pnl.RemoveView
   End If
   Dim h As Int
   h = (al.Actions.Size + 1) * ItemHeight + TopPadding
   scroll.Panel.AddView(al.Pnl, 0, 0, scroll.Width, (TopPadding + ItemHeight)*21)'
   If al.Visible = False Then
      al.InAnimation.Start(al.Pnl)
   End If
   Dim c As Canvas
   c = al.Canvas
   Dim r As Rect
   r.Initialize(0, 0, al.Pnl.Width, al.Pnl.Height)
   c.DrawRect(r, Colors.transparent, True, 0)
   c.DrawText(al.Title, scroll.Width / 2, TopPadding + ItemHeight / 2, Typeface.DEFAULT_BOLD, _
       TextSize, Colors.White, "CENTER")
   
   'Draw the items
   For i = 0 To al.Actions.Size - 1
      drawItem(i)
   Next
   al.Pnl.Invalidate
   al.Visible = True
    
ret = cd.Show("ADD NEW ITEMS", "OK", "CANCEL", "",LoadBitmapSample(File.DirAssets, "menu_add.png",25dip,25dip))
If ret=-1 Then
 '
Else


End If
End Sub


Sub Touch(Sdr As Object, Action As Int, X As Float, Y As Float)
   Dim pa As Panel
   pa = Sdr
   al = pa.Tag
   'Log(Action)
   
   If Action <> 1 Then 
      Dim currentItem As Int
      currentItem = Floor((Y - TopPadding - ItemHeight) / ItemHeight)
      If currentItem = al.Selected Then Return
      changeSelection(currentItem)
   Else If al.Selected >= 0 Then
      
      Dim item As ActionItem
      item = al.Actions.Get(al.Selected)
      
      
      CallSub2(al.ActivityName, "ActionList_Result", item.Value) 
      al.Selected =-1
      
   End If
End Sub
Sub drawItem(index As Int)
   Dim item As ActionItem
   item = al.Actions.Get(index)
   If item.Image.IsInitialized Then
      Dim imageRect As Rect
      imageRect.Initialize(ImageLeftPos, 0, ImageLeftPos + ImageWidth, 0)
      imageRect.Top = (index + 1) * ItemHeight + TopPadding + ImageTopPos
      imageRect.Bottom = imageRect.Top + ImageHeight
      al.Canvas.DrawBitmap(item.Image, Null, imageRect)
   End If
   
   al.Canvas.DrawText(item.Text, TextLeftPos, _
      (index + 1 + 0.5) * ItemHeight + TopPadding + al.Canvas.MeasureStringHeight(item.Text, Typeface.DEFAULT, TextSize) /2 _ 
         , Typeface.DEFAULT, TextSize, TextColor, "LEFT")
End Sub
Sub changeSelection(NewSelection As Int)
   Dim r As Rect
   Dim top As Int
   'delete the old selection
   If al.Selected >= 0 Then
      Dim pa As Path
      Dim y As Int
      y = (al.Selected + 1) * ItemHeight + TopPadding
      pa.Initialize(0,  y)
      pa.LineTo(0, y + ItemHeight)
      pa.LineTo(al.Pnl.Width, y + ItemHeight)
      pa.LineTo(al.Pnl.Width, y)
      al.Canvas.ClipPath(pa)
      r.Initialize(0, 0, al.Pnl.Width, al.Pnl.Height)
      al.Canvas.DrawRect(r, Colors.transparent, True, 0)
      drawItem(al.Selected)
      al.Canvas.RemoveClip
   End If
   If NewSelection >= 0 AND NewSelection < al.Actions.Size Then
      top = (NewSelection + 1) * ItemHeight + TopPadding + 3dip
      r.Initialize(3dip, top, al.Pnl.Width - 3dip, top + ItemHeight - 6dip)
      al.Canvas.DrawRect(r, SelectionColor, True, 0)
      drawItem(NewSelection)
      al.Selected = NewSelection
Else
      al.Selected = -1
   End If
   al.Pnl.Invalidate
End Sub
 

Informatix

Expert
Licensed User
Longtime User
Depuis la version 2, le gestionnaire par défaut de l'événement Touch a été modifié pour pouvoir être compatible avec MsgBox et DoEvents sous ICS. Je suppose que ton problème vient de là.
Est-ce que ton ScrollView fonctionne correctement en dehors du dialogue?
 

alan1968

Active Member
Licensed User
Longtime User
Depuis la version 2, le gestionnaire par défaut de l'événement Touch a été modifié pour pouvoir être compatible avec MsgBox et DoEvents sous ICS. Je suppose que ton problème vient de là.
Est-ce que ton ScrollView fonctionne correctement en dehors du dialogue?



bonne question ,je vais voir cela ! merci ;)

as tu eu l'occassion de tester mon code ?
 

alan1968

Active Member
Licensed User
Longtime User
Oui, et aucun événement ne semble sortir du dialogue. Donc je suspecte très fortement un problème entre les Touch events et le dialogue (qui est en fait une MsgBox modifiée).

ok ... c'est bien ce qui me semblai
as-tu une piste ou une alternative pour contounré ce petit probléme,

encore merci ;)
 

Informatix

Expert
Licensed User
Longtime User
ok ... c'est bien ce qui me semblai
as-tu une piste ou une alternative pour contounré ce petit probléme,

encore merci ;)

Eh bien, à part se passer de Dialogs, je n'ai pas d'idée. De toute façon, dimensionner correctement le contenu du CustomDialog sur différents appareils est super difficile, donc ça fait belle lurette que je ne l'utilise plus et je t'invite à t'en passer. Pour simuler un dialogue modal comme celui-là, c'est relativement simple: tu places un panel transparent sur la totalité de l'écran pour servir de bloqueur et par dessus tu places ton dialogue. Il faut aussi penser à gérer les touches (retour et menu notamment).
 

alan1968

Active Member
Licensed User
Longtime User
Eh bien, à part se passer de Dialogs, je n'ai pas d'idée. De toute façon, dimensionner correctement le contenu du CustomDialog sur différents appareils est super difficile, donc ça fait belle lurette que je ne l'utilise plus et je t'invite à t'en passer. Pour simuler un dialogue modal comme celui-là, c'est relativement simple: tu places un panel transparent sur la totalité de l'écran pour servir de bloqueur et par dessus tu places ton dialogue. Il faut aussi penser à gérer les touches (retour et menu notamment).


Pour le dimensionnement ,après l'avoir tester sur plusieurs modèle d'écran comme j'utilise des valeurs relatives cela ne pose pas de problème.merci pour ton aide peux être qu'erel pourra m'éviter de tout recoder ,au pire ce projet le le laisserai sous 1.8
 

Informatix

Expert
Licensed User
Longtime User
Pour le dimensionnement ,après l'avoir tester sur plusieurs modèle d'écran comme j'utilise des valeurs relatives cela ne pose pas de problème.

Oui, parce que dans ton cas, le contenu est très simple et peut défiler.

au pire ce projet le le laisserai sous 1.8

Erel a fait ces changements à cause d'ICS. Ton programme fonctionne-t-il bien sous ICS ?
 

alan1968

Active Member
Licensed User
Longtime User
Oui, parce que dans ton cas, le contenu est très simple et peut défiler.



Erel a fait ces changements à cause d'ICS. Ton programme fonctionne-t-il bien sous ICS ?



oui cela fonctionne sans problème,la copie d'écran vient d'une tablette sous ics 4.03 mais compiler avec b4a 1.8

j'ai même le thème Holo sous 1.8 avec l'ajout dans le manifest de la ligne

"<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14"/>"

comme j'ai acheté la version 2.0 et la 2.2 hier ,j'aurais aimé passer a cette nouvelle version,bien que dans mon cas la 1.8 fonctionne très bien
 

Informatix

Expert
Licensed User
Longtime User
oui cela fonctionne sans problème,la copie d'écran vient d'une tablette sous ics 4.03 mais compiler avec b4a 1.8

j'ai même le thème Holo sous 1.8 avec l'ajout dans le manifest de la ligne

"<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14"/>"

comme j'ai acheté la version 2.0 et la 2.2 hier ,j'aurais aimé passer a cette nouvelle version,bien que dans mon cas la 1.8 fonctionne très bien

Je me passe aussi du listener de B4A pour Touch. J'utilise le listener standard déclaré avec la lib Reflection:
B4X:
Dim r As Reflector
r.Target = your_view
r.SetOnTouchListener(...)
Il se comporte comme le listener pre-2.0, mais il faut l'utiliser avec précaution car il ne tolère ni DoEvents ni MsgBox dans le gestionnaire d'événements.
 

alan1968

Active Member
Licensed User
Longtime User
je confirme c'est bien la "CustomDialog2 " qui pose problème quand je mets mon scroll dans un panel cela fonctionne sous 2.2,je vais faire mon pseudo dialog avec un pannel donc,je mettrai la source ici une fois terminé ,ca peut toujours servir a qqun
 

Attachments

  • v22 copier.jpg
    v22 copier.jpg
    20.6 KB · Views: 232
Last edited:

alan1968

Active Member
Licensed User
Longtime User
voici la modif qui fonctionne avec 2.2

merci

B4X:
Sub Show 
Dim ret As Int
Dim ok_bp As Button
Dim cancel_bp As Button
Dim panel10 As Panel
Dim panel_select As Panel
Dim bmp As Bitmap
Dim picture As Label
Dim titre As Label
   'list_add =True
   panel_select.Initialize("")
   panel10.Initialize("")
   ok_bp.Initialize("ok_bp")
   cancel_bp.Initialize("cancel_bp")
   picture.Initialize ("")
   titre.Initialize("")
   titre.Text=" ADD NEW ITEMS"& CRLF & "(SELECT ITEM + OK)"
   titre.TextSize=20
   titre.TextColor=Colors.White
   ok_bp.Text="OK"
   cancel_bp.Text="CANCEL"
   bmp=LoadBitmapSample(File.DirAssets, "menu_add.png",40dip,40dip)
   picture.SetBackgroundImage(bmp)
   Activity.AddView(panel_select, 12%x-2dip,10%y-2dip,77%x+2dip, 80%y+2dip)
   panel_select.AddView(panel10, 2dip,2dip,77%x-2dip, 80%y-2dip)
   panel_select.Color=Colors.ARGB(255,0,255,255)
   panel10.BringToFront
   panel10.Color=Colors.ARGB(128,0,0,0)
   panel10.AddView(picture,0,0,40dip,40dip)
   panel10.AddView(titre,10%x,0,90%x,60dip)
   panel10.AddView(scroll,0,60dip,77%x,(panel10.Height-100dip))
   panel10.AddView(ok_bp,0,panel10.Height-40dip,panel10.Width/2,40dip)
   panel10.AddView(cancel_bp,panel10.Width/2,panel10.Height-40dip,panel10.Width/2,40dip)
   If al.Visible Then 
      al.InAnimation.stop(al.Pnl)
      al.Pnl.RemoveView
   End If
   Dim h As Int
   h = (al.Actions.Size + 1) * ItemHeight + TopPadding
   scroll.panel.AddView(al.Pnl, 0, 0, scroll.Width, (TopPadding + ItemHeight)*21)'
   If al.Visible = False Then
      al.InAnimation.Start(al.Pnl)
   End If
   Dim c As Canvas
   c = al.Canvas
   Dim r As Rect
   r.Initialize(0, 0, al.Pnl.Width, al.Pnl.Height)
   c.DrawRect(r, Colors.transparent, True, 0)
   c.DrawText(al.Title, scroll.Width / 2, TopPadding + ItemHeight / 2, Typeface.DEFAULT_BOLD, _
       TextSize, Colors.White, "CENTER")
   
   'Draw the items
   For i = 0 To al.Actions.Size - 1
      drawItem(i)
   Next
   al.Pnl.Invalidate
   al.Visible = True
    

End Sub
 

Attachments

  • ok22 copier.jpg
    ok22 copier.jpg
    29.7 KB · Views: 247
Top