B4A Class [B4X] [XUI] AS Popup Menu (on any view) [BETA]

Alexander Stolte

Expert
Licensed User
This is a simple cross platform Popup Menu.

I spend a lot of time in creating views, like this and to create a high quality view cost a lot of time. If you want to support me and further views, then you can do it here by Paypal. :)

Left: B4J Right: B4A

1598981805790.png
Screenshot_20200901-193834.jpg
ezgif.com-resize.gif
Screenshot_20201124-140900.jpg
IMG_2331.jpg

ASPopupMenu
Author: Alexander Stolte
Version: 1.06

  • ASPM_ItemLabelProperties
    • Fields:
      • BackgroundColor As Int
      • IsInitialized As Boolean
        Tests whether the object has been initialized.
      • ItemBackgroundColor As Int
      • LeftRightPadding As Float
      • TextAlignment_Horizontal As String
      • TextAlignment_Vertical As String
      • TextColor As Int
      • xFont As B4XFont
    • Functions:
      • Initialize
        Initializes the fields to their default value.
  • ASPM_TitleLabelProperties
    • Fields:
      • BackgroundColor As Int
      • Height As Float
      • IsInitialized As Boolean
        Tests whether the object has been initialized.
      • ItemBackgroundColor As Int
      • LeftRightPadding As Float
      • TextAlignment_Horizontal As String
      • TextAlignment_Vertical As String
      • TextColor As Int
      • xFont As B4XFont
    • Functions:
      • Initialize
        Initializes the fields to their default value.
  • ASPopupMenu
    • Events:
      • ItemClicked (Index As Int, Tag As Object)
    • Fields:
      • AutoHideMs As Int
    • Functions:
      • AddMenuItem (text As String, tag As Object) As String
      • AddTitle (Text As String, height As Float) As String
      • Class_Globals As String
      • Clear As String
        clears the list
      • CloseMenu As String
      • CreateASPM_ItemLabelProperties (TextColor As Int, xFont As B4XFont, TextAlignment_Vertical As String, TextAlignment_Horizontal As String, BackgroundColor As Int, ItemBackgroundColor As Int, LeftRightPadding As Float) As ASPM_ItemLabelProperties
      • CreateASPM_TitleLabelProperties (TextColor As Int, xFont As B4XFont, TextAlignment_Vertical As String, TextAlignment_Horizontal As String, BackgroundColor As Int, ItemBackgroundColor As Int, LeftRightPadding As Float, Height As Float) As ASPM_TitleLabelProperties
      • getBase As B4XView
      • getItemLabelProperties As ASPM_ItemLabelProperties
        change the label properties, call it before you add items
        <code>ASScrollingTags1.LabelProperties.xFont = xui.CreateDefaultBoldFont(15)</code>
      • GetMenuItemAt_Background (index As Int) As B4XView
        gets a menu item background (parent of label)
      • GetMenuItemAt_Label (index As Int) As B4XView
        gets a menu item label - the label with the text
      • getOrientationHorizontal_LEFT As String
      • getOrientationHorizontal_MIDDLE As String
      • getOrientationHorizontal_RIGHT As String
      • getOrientationVertical_BOTTOM As String
      • getOrientationVertical_TOP As String
        Vertical = Top,Bottom
        Horizontal = Left,Middle,Right
      • getSize As Int
        gets the list size
      • getTitleLabelProperties As ASPM_TitleLabelProperties
        change the label properties, call it before you add the title
        <code>ASScrollingTags1.TitleLabelProperties.xFont = xui.CreateDefaultBoldFont(20)</code>
      • Initialize (Parent As B4XView, CallBack As Object, EventName As String) As String
        Initializes the object. You can add parameters to this method if needed.
      • IsInitialized As Boolean
        Tests whether the object has been initialized.
      • OpenMenu (view As B4XView, width As Float)
        Opens the menu on a view
      • OpenMenu2 (parent As B4XView, width As Float)
        Open the menu on center of parent/view
      • RemoveTitle As String
        Removes the title if exists
      • Resize (parent_width As Float, parent_height As Float) As String
      • setActivityHasActionBar (value As Boolean) As String
      • setDividerColor (color As Int) As String
        the color of the dividers
      • setDividerEnabled (enable As Boolean) As String
        Adds or Removes the dividers
      • setDividerHeight (height As Float) As String
        the height of the dividers
      • setIsInSpecialContainer (value As Boolean) As String
        set it true if the target is on a listview or as a child on a panel where the left and top values differ from the form
      • setItemBackgroundColor (crl As Int) As String
        sets the item background color for all items
      • setMenuCornerRadius (radius As Int) As String
      • setOrientationHorizontal (orientation As String) As String
      • setOrientationVertical (orientation As String) As String
      • ViewScreenPosition (view As B4XView) As Int()
    • Properties:
      • ActivityHasActionBar
      • Base As B4XView [read only]
      • DividerColor
        the color of the dividers
      • DividerEnabled
        Adds or Removes the dividers
      • DividerHeight
        the height of the dividers
      • IsInSpecialContainer
        set it true if the target is on a listview or as a child on a panel where the left and top values differ from the form
      • ItemBackgroundColor
        sets the item background color for all items
      • ItemLabelProperties As ASPM_ItemLabelProperties [read only]
        change the label properties, call it before you add items
        <code>ASScrollingTags1.LabelProperties.xFont = xui.CreateDefaultBoldFont(15)</code>
      • MenuCornerRadius
      • OrientationHorizontal
      • OrientationHorizontal_LEFT As String [read only]
      • OrientationHorizontal_MIDDLE As String [read only]
      • OrientationHorizontal_RIGHT As String [read only]
      • OrientationVertical
      • OrientationVertical_BOTTOM As String [read only]
      • OrientationVertical_TOP As String [read only]
        Vertical = Top,Bottom
        Horizontal = Left,Middle,Right
      • Size As Int [read only]
        gets the list size
      • TitleLabelProperties As ASPM_TitleLabelProperties [read only]
        change the label properties, call it before you add the title
        <code>ASScrollingTags1.TitleLabelProperties.xFont = xui.CreateDefaultBoldFont(20)</code>
Changelog
  • 1.00
    • Release
  • 1.01
    • Adds background_color global variable - the background color of the parent view during the menu is open
    • Adds setItemBackgroundColor - change the items background color
    • Better Handling in "Nested Layouts"
    • Add ActivityHasActionBar - set to true if you have a ActionBar enabled
    • Add IsInSpecialContainer - set it true if the target is on a listview or as a child on a panel where the left and top values differ from the form
    • Add setOrientationVertical
    • Add setOrientationHorizontal
    • Adds "Enums" for Orientations -TOP,BOTTOM -LEFT,MIDDLE,RIGHT
  • 1.02
    • Add OpenMenu2 - Opens the menu in center of the parent view
    • Add Clear - clear all
    • Add getBase - gets the base view to customize it
    • Add getLabelProperties - customize it if you want, before you add a new menu item
      • Screenshot_20201124-134749.jpg
      • this is now possible
        • aspm_main.LabelProperties.ItemBackgroundColor = xui.Color_ARGB(255,Rnd(1,256), Rnd(1,256), Rnd(1,256))
    • Remove background_color and itembackground_color
      • Added to getLabelProperties
    • Add GetMenuItemAt_Label
    • Add GetMenuItemAt_Background
    • Add getSize
    • Add setMenuCornerRadius - sets the corner radius for the menu (works only in B4A and B4I)
      • Screenshot_20201124-140900.jpg
  • 1.03
    • Add LeftRightPadding to ASPM_LabelProperties - label padding to have more space left and right for example HorizontalCenter = LEFT
    • OpenMenu the background is now smoother on show
    • setMenuCornerRadius is now available on B4J (thanks @Erel)
  • 1.04
    • getLabelProperties is renamed to getItemLabelProperties
    • Add AddTitle - you can now add a title to the menu
      • Add TitleLabelProperties - you can change the title properties with it
    • Add RemoveTitle - Removes the title if exists
    • Add AutoHideMs
    • Add DividerEnabled - you can now show dividers between the items
      • Add DividerHeight - the height of the dividers
      • Add DividerColor - the color of the dividers
  • 1.05
    • OpenMenu Show Animation with the background is now animated
    • BugFixes
  • 1.06
    • BugFixes
Have Fun :)
 

Attachments

Last edited:

Xfood

Well-Known Member
Licensed User
Nice, could you add the background color, the text color, and an image? would be great
 

Alexander Stolte

Expert
Licensed User
Update
  • 1.01
    • Adds background_color global variable - the background color of the parent view during the menu is open
    • Adds setItemBackgroundColor - change the items background color
    • Better Handling in "Nested Layouts"
    • Add ActivityHasActionBar - set to true if you have a ActionBar enabled
    • Add IsInSpecialContainer - set it true if the target is on a listview or as a child on a panel where the left and top values differ from the form
    • Add setOrientationVertical
    • Add setOrientationHorizontal
    • Adds "Enums" for Orientations -TOP,BOTTOM -LEFT,MIDDLE,RIGHT
"Nested Layouts" are a challenging task... 😅
 

Alexander Stolte

Expert
Licensed User
Update
  • 1.02
    • Add OpenMenu2 - Opens the menu in center of the parent view
    • Add Clear - clear all
    • Add getBase - gets the base view to customize it
    • Add getLabelProperties - customize it if you want, before you add a new menu item
      • Screenshot_20201124-134749.jpg
      • this is now possible
        • aspm_main.LabelProperties.ItemBackgroundColor = xui.Color_ARGB(255,Rnd(1,256), Rnd(1,256), Rnd(1,256))
    • Remove background_color and itembackground_color
      • Added to getLabelProperties
      • Add GetMenuItemAt_Label
      • Add GetMenuItemAt_Background
      • Add getSize
    • Add setMenuCornerRadius - sets the corner radius for the menu (works only in B4A and B4I)

      • Screenshot_20201124-140900.jpg
 

Erel

Administrator
Staff member
Licensed User
Add setMenuCornerRadius - sets the corner radius for the menu (works only in B4A and B4I)
This is the relevant code from B4XImageView:
B4X:
#if B4J
    Dim jo As JavaObject = mBase
    Dim shape As JavaObject
    If mRound Then
        Dim radius As Double = Min(mBase.Width / 2, mBase.Height / 2)
        Dim cx As Double = mBase.Width / 2
        Dim cy As Double = mBase.Height / 2
        shape.InitializeNewInstance("javafx.scene.shape.Circle", Array(cx, cy, radius))
    Else
        Dim cx As Double = mBase.Width
        Dim cy As Double = mBase.Height
        shape.InitializeNewInstance("javafx.scene.shape.Rectangle", Array(cx, cy))
        If mCornersRadius > 0 Then
            Dim d As Double = mCornersRadius
            shape.RunMethod("setArcHeight", Array(d))
            shape.RunMethod("setArcWidth", Array(d))
        End If
    End If
    jo.RunMethod("setClip", Array(shape))
#else if B4A
 

Alexander Stolte

Expert
Licensed User
This is the relevant code from B4XImageView:
Thanks @Erel :)

Update
  • 1.03
    • Add LeftRightPadding to ASPM_LabelProperties - label padding to have more space left and right for example HorizontalCenter = LEFT
    • OpenMenu the background is now smoother on show
    • setMenuCornerRadius is now available on B4J (thanks @Erel)
 

Alexander Stolte

Expert
Licensed User
Is it possible to include symbols with Material Icons or FontAwesome?
sure, but the result is not so good:
B4X:
    For i = 0 To 4 -1
        aspm_main.LabelProperties.ItemBackgroundColor = xui.Color_ARGB(255,Rnd(1,256), Rnd(1,256), Rnd(1,256))
        aspm_main.LabelProperties.xFont = xui.CreateMaterialIcons(15)
        aspm_main.AddMenuItem(Chr(0xE859) &  " Test_" & (i +1),"item_" & i)
    Next
1606245913314.png
 

Alexander Stolte

Expert
Licensed User
Does it support CSBuilder?
Yes, but only on B4A and B4I.
B4X:
    For i = 0 To 4 -1
        aspm_main.LabelProperties.ItemBackgroundColor = xui.Color_ARGB(255,Rnd(1,256), Rnd(1,256), Rnd(1,256))
        Dim cs As CSBuilder
        'aspm_main.AddMenuItem(Chr(0xE859) &  " Test_" & (i +1),"item_" & i)
        aspm_main.AddMenuItem("","item_" & i)
        aspm_main.GetMenuItemAt_Label(i).Text = cs.Initialize.Typeface(Typeface.MATERIALICONS).Append(Chr(0xE859)).Typeface(Typeface.DEFAULT).Append(" Test_" & (i +1)).PopAll
    Next
Screenshot_20201125-155624.jpg
 

Andrew (Digitwell)

Active Member
Licensed User
Found it. :)

B4X:
'Note that we vertically align the material icon character.
cs.Initialize.Append("Text with MaterialIcons: ").Typeface(Typeface.MATERIALICONS).VerticalAlign(5dip).Append(Chr(0xE531)).PopAll
 

Alexander Stolte

Expert
Licensed User
Update
1.04

  • getLabelProperties is renamed to getItemLabelProperties
  • Add AddTitle - you can now add a title to the menu
    • Add TitleLabelProperties - you can change the title properties with it
  • Add RemoveTitle - Removes the title if exists
  • Add AutoHideMs
  • Add DividerEnabled - you can now show dividers between the items
    • Add DividerHeight - the height of the dividers
    • Add DividerColor - the color of the dividers
The update in one picture:
IMG_2331.jpg

Examples:
show dividers:
aspm_main.DividerEnabled = True
aspm_main.DividerHeight = 2dip
aspm_main.DividerColor = xui.Color_White
add title:
aspm_main.AddTitle("Title",60dip)
 
Last edited:

Rubsanpe

Active Member
Licensed User
Hi. I am trying to change the background color of the title with no luck so far.

Change background title color:
aspm_main.TitleLabelProperties.BackgroundColor = xui.color_White
aspm_main.AddTitle("Title",60dip)
But the background color is still black. It doesn't matter what color I put on it.

Rubén
 

Rubsanpe

Active Member
Licensed User
Thank you. Background is changed, but a black border continues to surround it.

Captura.PNG


Solved assigning color to ItemBackgroundColor

B4X:
aspm_main.TitleLabelProperties.BackgroundColor = xui.Color_Gray
aspm_main.TitleLabelProperties.ItemBackgroundColor = xui.Color_Gray
aspm_main.AddTitle("Title",60dip)
Captura2.PNG


Rubén
 
Last edited:
Top