Hi.
I am trying to do this that I have done in B4J ( https://www.b4x.com/android/forum/threads/scroll-background-color-by-words-in-a-string.120845) in B4A, but not run and it gives me the next error:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
Error occurred on line: 112 (Main)
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Object.equals(java.lang.Object)' on a null object reference
at b4a.ScrollBackgroundColorWords.main._addbackgroundpanels(main.java:583)
at b4a.ScrollBackgroundColorWords.main._activity_create(main.java:442)
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:144)
at b4a.ScrollBackgroundColorWords.main.afterFirstLayout(main.java:105)
at b4a.ScrollBackgroundColorWords.main.access$000(main.java:17)
at b4a.ScrollBackgroundColorWords.main$WaitForLayout.run(main.java:83)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6823)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1557)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
** Activity (main) Resume **
In the Designer I have exactly the same Views.
What am I doing wrong?
My B4A code is the following:
B4X:
#Region Project Attributes
#ApplicationLabel: B4A Background_Color_Words
#VersionCode: 1
#VersionName:
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: unspecified
#CanInstallToExternalStorage: true
#End Region
#Region Activity Attributes
#FullScreen: False
#IncludeTitle: True
#End Region
Sub Process_Globals
Private xui As XUI
End Sub
Sub Globals
Private WordsToHighlight As B4XSet
Dim BBCodeView1 As BBCodeView
Private TextEngine As BCTextEngine
Dim myString As String = "Put here the string you want to use."
Dim listIndex As List
Dim listWordsSpaces As List
Private Button1 As B4XView
Dim count As Int = 0
Dim sb1 As StringBuilder
Dim sb2 As StringBuilder
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout1")
listIndex.Initialize
listIndex = getIndexListWordsSpaces(myString)
listWordsSpaces.Initialize
listWordsSpaces = getListWordsSpaces(myString, listIndex)
sb1.Initialize
sb2.Initialize
sb1.Append("[TextSize=20]") ' Put the text size here
sb1.Append(myString)
sb1.Append("[/TextSize]")
TextEngine.Initialize(Activity)
WordsToHighlight = B4XCollections.CreateSet2(listWordsSpaces)
BBCodeView1.Text = sb1.ToString
AddBackgroundPanels
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
WordsToHighlight = B4XCollections.CreateSet2(Array(listWordsSpaces.Get(count),""))
count = count + 1
sb2.Initialize
sb2.Append(sb1.ToString)
If count = listIndex.Size Then
count = 0
Else
sb2.Insert(listIndex.Get(count-1)+13, "[plain]")
sb2.Insert(listIndex.Get(count)+7+13, "[/plain]")
BBCodeView1.Text = sb2.ToString
End If
AddBackgroundPanels
End Sub
Sub getIndexListWordsSpaces(str As String) As List
Dim indexF As List
Dim index As Int = 0
Dim index0 As Int
indexF.Initialize
indexF.Add(index)
index = str.IndexOf2(" ",index+1)
indexF.Add(index)
Do While index <> -1
index0 = index
index = str.IndexOf2(" ",index+1)
If index > index0 + 1 Then
indexF.Add(index0+1)
indexF.Add(index)
Else
If index = -1 Then
indexF.Add(index0+1)
Else
indexF.Add(index)
End If
End If
Loop
If str.SubString(indexF.Get(indexF.Size-1)) = "" Then
indexF.RemoveAt(indexF.Size-1)
End If
Return indexF
End Sub
Sub getListWordsSpaces(str As String, listIndexM As List) As List
Dim listWordsSpaces As List
listWordsSpaces.Initialize
For i=0 To listIndexM.Size-2
listWordsSpaces.Add(str.SubString2(listIndexM.Get(i),listIndexM.Get(i+1)))
Next
listWordsSpaces.Add(str.SubString(listIndexM.Get(i)))
Return listWordsSpaces
End Sub
Private Sub AddBackgroundPanels
For Each x As B4XView In BBCodeView1.sv.ScrollViewInnerPanel.GetAllViewsRecursive
If x.Tag = "background" Then
x.RemoveViewFromParent
End If
Next
Dim scale As Float = TextEngine.mScale
For Each line As BCTextLine In BBCodeView1.Paragraph.TextLines
For Each un As BCUnbreakableText In line.Unbreakables
For Each s As BCSingleStyleSection In un.SingleStyleSections
If WordsToHighlight.Contains(s.Run.Text) Then
Dim pnl As B4XView = xui.CreatePanel("")
pnl.Color = 0xFF00D2FF
pnl.Tag = "background"
BBCodeView1.sv.ScrollViewInnerPanel.AddView(pnl, BBCodeView1.Padding.Left + s.AbsoluteStartX / scale - 2dip, _
BBCodeView1.Padding.Top + (line.BaselineY - s.MaxHeightAboveBaseLine) / scale - 2dip, _
s.Width / scale + 4dip, (s.MaxHeightBelowBaseLine + s.MaxHeightAboveBaseLine) / scale + 4dip)
pnl.SendToBack
End If
Next
Next
Next
End Sub
Last edited: