I'm trying to create a class based on this example:
And it fails while executing following line of code
Could someone kindly tell me what I did wrong, please?
TIA
[B4X] [B4XPages] Menu badges
This is a B4i + B4A example. It adds a dynamic badge to the menu icon. It also shows how to update menu items at runtime. Don't miss: 1. B4A - theme settings in manifest editor. 2. B4i - theme settings in main module. Both are not really needed for this example but are useful.
www.b4x.com
menu badge class file:
Sub Class_Globals
Private Root As B4XView
Private xui As XUI
Private CartBitmap As B4XBitmap
Private IconCanvas As B4XCanvas
Private mBadgeNumber As Int
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize(root1 As B4XView, BadgeNumber As Int)
Root=root1
mBadgeNumber=BadgeNumber
CartBitmap = xui.LoadBitmap(File.DirAssets, "cart.png")
Dim p As B4XView = xui.CreatePanel("")
p.SetLayoutAnimated(0, 0, 0, 32dip, 32dip)
IconCanvas.Initialize(p)
End Sub
Public Sub UpdateMenuItems
Dim bmp As B4XBitmap = CreateIconWithBadge(CartBitmap, mBadgeNumber)
#if B4A
Dim menus As List = B4XPages.GetManager.GetPageInfoFromRoot(Root).Parent.MenuItems
menus.Clear
'add menu items
Dim mi As B4AMenuItem = B4XPages.AddMenuItem(Root, "cart")
mi.AddToBar = True
mi.Bitmap = bmp
Dim ctxt As JavaObject
ctxt.InitializeContext
ctxt.RunMethod("invalidateOptionsMenu", Null)
#else if B4i
Dim bb As BarButton
bb.InitializeBitmap(Main.KeepOriginalColors(bmp), "cart")
B4XPages.GetNativeParent(Me).TopRightButtons = Array(bb)
#end if
End Sub
Private Sub CreateIconWithBadge(bmp As B4XBitmap, Number As Int) As B4XBitmap
IconCanvas.ClearRect(IconCanvas.TargetRect)
IconCanvas.DrawBitmap(bmp, IconCanvas.TargetRect)
Number = Min(Number, 9)
If Number > 0 Then
Dim cx As Int = IconCanvas.TargetRect.Width - 8dip
Dim cy As Int = 8dip
IconCanvas.DrawCircle(cx, cy, cy, Colors.Red, True, 0)
Dim fnt As B4XFont = xui.CreateDefaultBoldFont(12)
Dim r As B4XRect = IconCanvas.MeasureText(Number, fnt)
Dim BaseLine As Int = cy - r.Height / 2 - r.Top
IconCanvas.DrawText(Number, cx, BaseLine, fnt, xui.Color_White, "CENTER")
End If
Return IconCanvas.CreateBitmap
End Sub
public Sub increment
mBadgeNumber=mBadgeNumber +1
UpdateMenuItems
End Sub
public Sub decrement
mBadgeNumber=mBadgeNumber-1
UpdateMenuItems
End Sub
public Sub Clear
mBadgeNumber=0
UpdateMenuItems
End Sub
And it fails while executing following line of code
Root variable is from page2's Root:
Dim mi As B4AMenuItem = B4XPages.AddMenuItem(Root, "cart")
error logs:
Error occurred on line: 312 (B4XPagesManager)
java.lang.NullPointerException: Attempt to read from field 'com.ddg.menu.badge.b4xpagesmanager$_b4xpageparent com.ddg.menu.badge.b4xpagesmanager$_b4xpageinfo.Parent' on a null object reference
at com.ddg.menu.badge.b4xpagesmanager._addmenuitem(b4xpagesmanager.java:224)
at com.ddg.menu.badge.b4xpages._addmenuitem(b4xpages.java:81)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:146)
at anywheresoftware.b4a.debug.Debug.delegate(Debug.java:262)
at com.ddg.menu.badge.clscartmenubadge._updatemenuitems(clscartmenubadge.java:88)
at com.ddg.menu.badge.page2._b4xpage_created(page2.java:77)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.debug.Debug.CallSub4(Debug.java:318)
at anywheresoftware.b4a.debug.Debug.CallSubNew2(Debug.java:285)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.keywords.Common.CallSubDebug2(Common.java:1058)
at com.ddg.menu.badge.b4xpagesmanager._createpageifneeded(b4xpagesmanager.java:1082)
at com.ddg.menu.badge.b4xpagesmanager._showpage(b4xpagesmanager.java:439)
at com.ddg.menu.badge.b4xpages._showpage(b4xpages.java:55)
at com.ddg.menu.badge.b4xmainpage._button1_click(b4xmainpage.java:188)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:146)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:193)
at anywheresoftware.b4a.objects.ViewWrapper$1.onClick(ViewWrapper.java:80)
at android.view.View.performClick(View.java:8160)
at android.widget.TextView.performClick(TextView.java:16222)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access$3700(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8550)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Could someone kindly tell me what I did wrong, please?
TIA
Attachments
Last edited: