You are on page 1of 336

Beginner's Guide

Copyright: © 2011 Anywhere Software Edition 1.6


Table of contents 2 Basic4Android Beginner's Guide

1 Getting started ......................................................................................................................... 7


1.1 Installing Basic4Android and Android SDK .................................................................... 7
1.1.1 Install and configure Basic4Android ........................................................................ 9
1.2 Installing Android Emulator........................................................................................... 10
2 My first program (MyFirstProgram.b4a)............................................................................... 15
3 Second program (SecondProgram.b4a) ................................................................................. 33
4 The IDE ................................................................................................................................ 46
4.1 Menu and Toolbar.......................................................................................................... 47
4.1.1 Toolbar .................................................................................................................. 47
4.1.2 File menu ............................................................................................................... 48
4.1.3 Edit menu............................................................................................................... 48
4.1.4 Project menu .......................................................................................................... 49
4.1.5 Tools menu ............................................................................................................ 50
4.2 Code area....................................................................................................................... 52
4.2.1 Undo – Redo ............................................................................................. 52
4.2.2 Collapse a subroutine ............................................................................................. 52
4.2.3 Collapse a Region .................................................................................................. 53
4.2.4 Collapse the whole code......................................................................................... 54
4.2.5 Commenting and uncommenting code ...................................................... 55
4.2.6 Bookmarks .................................................................................. 55
4.2.7 Indentation ............................................................................................... 56
4.2.8 Autocomplete ................................................................................................. 58
4.2.9 Jump to a subroutine .............................................................................................. 60
4.2.10 Highlighting occurences of words .......................................................................... 61
4.2.11 Debugging ............................................................................................................. 62
4.2.12 Breakpoints............................................................................................................ 64
4.3 Tabs............................................................................................................................... 67
4.3.1 Module and subroutine lists ............................................................... 67
4.3.2 Files ....................................................................................................... 68
4.3.3 Logs ...................................................................................................... 69
4.3.4 Libs ........................................................................................................ 70
5 Screen sizes and resolutions................................................................................................... 71
5.1 Specilal functions like 50%x, 50dip ............................................................................. 76
5.1.1 PerXToCurrent, PerYToCurrent - 50%x................................................................. 76
5.1.2 DipToCurrent - 50dip............................................................................................. 76
6 The Emulator......................................................................................................................... 77
6.1 Launch an Emulator....................................................................................................... 77
6.2 Generate a new Emulator............................................................................................... 79
6.3 Emulator problems......................................................................................................... 81
6.3.1 Process timeout ...................................................................................................... 82
7 B4A Bridge ........................................................................................................................... 83
8 The Designer ......................................................................................................................... 86
8.1 The menu....................................................................................................................... 87
8.1.1 File menu ............................................................................................................... 87
8.1.2 AddView menu ...................................................................................................... 87
8.1.3 The Tools menu ..................................................................................................... 88
8.2 Tools ............................................................................................................................. 89
8.2.1 Generate Members ................................................................................................. 89
8.2.2 BringTo Front ........................................................................................................ 90
Table of contents 3 Basic4Android Beginner's Guide

8.2.3 Duplicate Selected View ........................................................................................ 90


8.2.4 Remove Selected View .......................................................................................... 91
8.2.5 Change grid............................................................................................................ 91
8.2.6 Connect device or emulator.................................................................................... 92
8.3 General settings ............................................................................................................. 92
8.4 Image files ..................................................................................................................... 93
8.5 Properties list ................................................................................................................. 94
8.6 Layout variants .............................................................................................................. 96
8.7 The Abstract Designer ................................................................................................. 101
8.7.1 The menu ............................................................................................................. 102
8.7.2 Example............................................................................................................... 103
8.8 Adding views by code.................................................................................................. 106
9 Process and Activity life cycle............................................................................................. 109
10 Variables and objects....................................................................................................... 113
10.1 Variable Types............................................................................................................. 113
10.2 Names of variables ...................................................................................................... 114
10.3 Declaring variables ...................................................................................................... 114
10.3.1 Simple variables................................................................................................... 114
10.3.2 Array variables..................................................................................................... 115
10.3.3 Array of views (objects) ....................................................................................... 117
10.3.4 Type variables...................................................................................................... 118
10.4 Casting ........................................................................................................................ 119
10.5 Scope........................................................................................................................... 120
10.5.1 Process variables.................................................................................................. 120
10.5.2 Activity variables ................................................................................................. 120
10.5.3 Local variables..................................................................................................... 120
10.6 Tips ............................................................................................................................. 121
11 Modules........................................................................................................................... 122
11.1 Activity modules.......................................................................................................... 123
11.2 Code modules .............................................................................................................. 124
11.3 Service modules........................................................................................................... 125
12 Example programs........................................................................................................... 126
12.1 User interfaces ............................................................................................................. 126
12.1.1 Menu example (UserInterfaceMenu.b4a)............................................................. 127
12.1.2 TabHost example (UserInterfaceTabHost.b4a) ................................................... 128
12.1.3 Button toolbox example (UserInterfaceButtonToolbox.b4a)................................ 129
12.2 Program with 3 Activities (ThreeActivityExample.b4a) .............................................. 130
12.3 ScrollView examples ................................................................................................... 137
12.3.1 ScrollView example program............................................................................... 138
13 SQLite Database.............................................................................................................. 149
13.1 SQLite Database basics................................................................................................ 149
13.2 SQLite Database example program.............................................................................. 152
13.2.1 Editing ................................................................................................................. 154
13.2.2 Filtering ............................................................................................................... 155
13.2.3 Beginning of the code .......................................................................................... 156
13.2.4 Read the table ...................................................................................................... 159
13.2.5 Modify a data set.................................................................................................. 161
13.2.6 Add a data set to the database............................................................................... 162
13.2.7 Delete a data set from the database....................................................................... 164
13.2.8 Positioning of the EditText Views in the Edit panel.............................................. 165
14 GPS ................................................................................................................................. 166
14.1 GPS Library................................................................................................................. 166
14.1.1 GPS Object .......................................................................................................... 166
Table of contents 4 Basic4Android Beginner's Guide

14.1.2 GPS Satellite........................................................................................................ 167


14.1.3 GPS Location....................................................................................................... 167
14.2 GPS Program............................................................................................................... 168
14.2.1 General explanations ............................................................................................ 171
14.2.2 Setup.................................................................................................................... 172
14.2.3 GPS display ......................................................................................................... 173
14.2.4 Satellites .............................................................................................................. 174
14.2.5 Map display ......................................................................................................... 175
14.2.6 GPS path.............................................................................................................. 177
14.3 GPS Program Code...................................................................................................... 181
14.3.1 Initialization of the GPS....................................................................................... 182
14.3.2 Button with tooltip ............................................................................................... 183
14.3.3 Button with tooltip and additional buttons ............................................................ 186
14.3.4 GPS Calculate distance scales .............................................................................. 189
14.3.5 Drawing GPS position.......................................................................................... 190
15 Basic language................................................................................................................. 193
15.1 Program flow ............................................................................................................... 193
15.1.1 Process_Globals routine ....................................................................................... 193
15.1.2 Globals routine..................................................................................................... 194
15.1.3 Activity_Create (FirstTime As Boolean) routine .................................................. 194
15.1.4 Activity_Resume routine...................................................................................... 194
15.1.5 Activity_Pause (UserClosed As Boolean) routine................................................. 194
15.2 Expressions.................................................................................................................. 196
15.2.1 Mathematical expressions .................................................................................... 196
15.2.2 Relational expressions.......................................................................................... 197
15.2.3 Boolean expressions............................................................................................. 197
15.3 Conditional statements................................................................................................. 197
15.3.1 If – Then – End If................................................................................................. 198
15.3.2 Select – Case........................................................................................................ 199
15.4 Loop structures ............................................................................................................ 201
15.4.1 For – Next............................................................................................................ 201
15.4.2 Do - Loop ............................................................................................................ 202
15.5 Subs............................................................................................................................. 203
15.5.1 Declaring ............................................................................................................. 203
15.5.2 Calling a Sub........................................................................................................ 203
15.5.3 Naming ................................................................................................................ 203
15.5.4 Parameters ........................................................................................................... 204
15.5.5 Returned value ..................................................................................................... 204
15.6 Events.......................................................................................................................... 205
15.7 Libraries ...................................................................................................................... 208
15.7.1 Standard libraries ................................................................................................. 208
15.7.2 Additional libraries folder .................................................................................... 208
15.7.3 Error message "Are you missing a library reference?" .......................................... 209
15.8 String manipulation ..................................................................................................... 210
15.9 Timers ......................................................................................................................... 211
15.10 Files......................................................................................................................... 212
15.10.1 File object ........................................................................................................ 212
15.10.2 TextWriter........................................................................................................ 214
15.10.3 TextReader....................................................................................................... 215
15.10.4 Text encoding................................................................................................... 216
16 Graphics / Drawing.......................................................................................................... 218
16.1 Overview ..................................................................................................................... 218
16.2 Drawing test programs ................................................................................................. 220
Table of contents 5 Basic4Android Beginner's Guide

16.2.1 Drawing rotating bitmaps / RotatingNeedle.......................................................... 220


16.2.2 Simple draw functions.......................................................................................... 225
17 Widgets, home screen widgets ......................................................................................... 234
17.1 Widgets Part I ............................................................................................................. 234
17.2 Widgets Part II............................................................................................................ 237
18 B4A Keywords ................................................................................................................ 240
18.1 Bit ............................................................................................................................... 240
18.2 DateTime..................................................................................................................... 241
18.3 Exception..................................................................................................................... 244
18.4 Keywords .................................................................................................................... 245
18.5 LayoutValues............................................................................................................... 257
18.6 String........................................................................................................................... 258
18.7 StringBuilder ............................................................................................................... 260
18.8 Timer........................................................................................................................... 262
19 Views .............................................................................................................................. 264
19.1 Activity........................................................................................................................ 264
19.2 Button.......................................................................................................................... 268
19.3 CheckBox.................................................................................................................... 271
19.4 EditText....................................................................................................................... 274
19.5 ImageView .................................................................................................................. 279
19.6 Label ........................................................................................................................... 282
19.7 ListView...................................................................................................................... 285
19.8 Panel............................................................................................................................ 290
19.9 ProgressBar ................................................................................................................. 293
19.10 RadioButton............................................................................................................. 295
19.11 ScrollView............................................................................................................... 298
19.12 SeekBar ................................................................................................................... 301
19.13 Spinner .................................................................................................................... 304
19.14 TabHost ................................................................................................................... 308
19.15 ToggleButton........................................................................................................... 312
19.16 View ........................................................................................................................ 315
19.17 WebView................................................................................................................. 317
20 VB6 versus B4A.............................................................................................................. 321
21 FAQ ................................................................................................................................ 326
21.1 "Please save project first" message............................................................................. 326
21.2 "Are you missing a library reference" message........................................................... 326
21.3 How loading / updating a library.................................................................................. 327
21.4 When do we need to 'Initialize' and when not............................................................. 327
21.5 Split a long line into two or more lines......................................................................... 328
21.6 Avoid closing an application........................................................................................ 328
21.7 Unwanted events like Click, Touch or others ............................................................... 329
21.8 Adding a Menu item .................................................................................................... 329
21.9 How do I remove a View with the Designer................................................................. 330
21.10 "Process has timeout" message............................................................................... 330
21.11 Getting a picture from the gallery............................................................................. 331
21.12 How to delete x.bal files or other files from a project ............................................. 331
21.13 Block a screen orientation ........................................................................................ 332
21.14 Close second Activity .............................................................................................. 333
21.15 Taking a screenshot programaticaly ......................................................................... 333
21.16 After compiling, where are the files ......................................................................... 333
21.17 Run an application from another one........................................................................ 334
21.18 How to pass an Array to a Sub ................................................................................. 334
21.19 Getting language and country from device ............................................................... 335
Table of contents 6 Basic4Android Beginner's Guide

22 Glossary .......................................................................................................................... 336

Main contributors :

Erel Uziel
Klaus Christl
nfordbscndrd
1 Getting started 7 Basic4Android Beginner's Guide

1 Getting started
Basic4android is a simple yet powerful development environment that targets Android devices.
Basic4android language is similar to Visual Basic language with additional support for objects.
Basic4android compiled applications are native Android applications, there are no extra runtimes or
dependencies.
Unlike other IDEs Basic4android is 100% focused on Android development.
Basic4android includes a powerful GUI designer with built-in support for multiple screens and
orientations. No XML writing is required.
You can develop and debug with the Android emulator or with a real device
(USB connected or over the local network).
Basic4android has a rich set of libraries that make it easy to develop advanced applications.
This includes: SQL databases, GPS, Serial ports (Bluetooth), Camera, XML parsing, Web services
(HTTP), Services (background tasks), JSON, Animations, Network (TCP and UDP), Text To Speech
(TTS), Voice Recognition, WebView, AdMob (ads), Charts, OpenGL, Graphics and more.

Android 1.6 and above are supported (including tablets like Motorola Xoom).

1.1 Installing Basic4Android and Android SDK

Basic4android depends on two additional (free) components:


- Java JDK
- Android SDK

Installation instructions:
The first step should be to install the Java JDK as Android SDK requires it as well.
Note that there is no problem with having several versions of Java installed on the same computer.

- Open the Java 6 JDK download link.


- Check the Accept License Agreement radio button.
- Select "Windows x86" in the platforms list (for 64 bit machines as well).
Android SDK doesn't work with Java 64bit JDK.
You should install the regular JDK for 64-bit computers as well.

- Download the file and install it.

Next step is to install the Android SDK and a platform:

- Install the SDK. The SDK doesn't always behave properly when it is installed in a path with
spaces (like Program Files). It is recommended to install it to a custom folder similar to
C:\Android.
- You should now install the platform tools and at least one platform image. You can use API 8 or
above. It is recommended to use API 8.
You can also install Google USB Driver if you need to connect a real device with USB.
1 Getting started 8 Basic4Android Beginner's Guide

Note that you can install more packages later.

- Press on Install Selected and install both packages.


1 Getting started 9 Basic4Android Beginner's Guide

1.1.1 Install and configure Basic4Android

- Download and install Basic4android.

- Open Basic4android.

- Choose Tools menu - Configure Paths.

- Use the browse buttons to locate "javac.exe" and "android.jar"


javac is located under <java folder>\bin.

android.jar is located under <android-sdk-windows>\platforms\android-8


The folder depends on where you installed the Android SDK,
it should be C:\Android\android-sdk-windows\platforms\android-8\android.jar.

On Windows 64 bit, Java will probably be installed under C:\Program Files (x86).

Common errors
- Windows XP - "Basic4Android.exe Application could not be initialised correctly error
0xc0000135" on startup. Basic4android requires .Net Framework 2.0 or above. Windows XP users
who didn't install it before should first install the framework.

- "javac: target release 1.5 conflicts with default source release 1.7" - Currently Basic4android
requires Java 6. It will not work with Java 7. Both versions can be installed on the same computer.
1.2 Installing Android Emulator 10 Basic4Android Beginner's Guide

1.2 Installing Android Emulator

Please follow the installation (and configuration) instructions if you have not done it yet:
http://www.basic4ppc.com/forum/basic...droid-sdk.html.

In this chapter, we will create a new AVD (Android Virtual Device) which is an emulator instance.
Then we will create a simple program that displays a simple message box and writes a message to
the log.
You can also connect a real device to the IDE:
Connecting your device with ADB
Connecting your device with B4A-Bridge

Create new AVD

- Run Basic4android.

- Choose Tools Menu - Run AVD Manager.


Wait a few seconds.

- The SDK Manager may appear depending on the version and configuration. You should choose
Tools - Manage AVDs.
1.2 Installing Android Emulator 11 Basic4Android Beginner's Guide

- The AVD Manager should appear:

- Click on and fill the fields similar to the following image(it is recommended to choose
HVGA):

- Click on .

- Note that you can create more than one


AVD. Each can have a different resolution
or can target a different API version (you
will need to install additional platforms
first).
1.2 Installing Android Emulator 12 Basic4Android Beginner's Guide

- Now click on in order to start the emulator.

- You will see this screen.

- Click on to start the emulator

- You will see several windows popping up and disappearing. This is fine.
1.2 Installing Android Emulator 13 Basic4Android Beginner's Guide

- The emulator should boot up:

Wait... on the first time it can take several minutes until the emulator is ready.
1.2 Installing Android Emulator 14 Basic4Android Beginner's Guide

The emulator is ready when it gets to


this screen:

You may see this screen, which is the lock screen,


instead:

Drag the lock icon to the right to unlock the


device.

Note that there is no need to restart the emulator


each time you deploy a program. The emulator
can be kept running all the time.

If you are not familiar with Android you can play


with the emulator. Press on the button with the
small squares to get to the application page.

Troubleshooting: If you get an error message


similar to:
invalid command-line parameter:
Files\Android\android-sdk\tools/emulator-
arm.exe.
Hint: use '@foo' to launch a virtual device named
'foo'.
2 My first program 15 Basic4Android Beginner's Guide

2 My first program (MyFirstProgram.b4a)


Let us write our first program.
The suggested program is a math trainer for kids.

On the screen, we will have:


- 2 Labels displaying randomly generated numbers
- 1 Label with the math sign
- 1 EditText view where the user must enter the result
- 1 Button, used to either confirm when the user has finished entering the result or generate a new
calculation.
- 1 Label with a comment about the result.

We will design the layout of the user interface with the Designer on the Emulator and go step by
step through the whole process.
2 My first program 16 Basic4Android Beginner's Guide

Run the IDE

Save the project.

You must save the project before you can run the Designer.

Create a new folder MyFirstProgram and save


the project with the name MyFirstProgram.

Run the Emulator.

Select the Emulator.


2 My first program 17 Basic4Android Beginner's Guide

The portrait Emulator in this case. Click on

Click on

Wait until the Emulator is ready, this will take quite some time.

Run the Designer.

Wait until the Designer is ready.


2 My first program 18 Basic4Android Beginner's Guide

Connect the Emulator to the Designer.

Wait until the Designer and the Emulator are


connected, this can take some time, be patient.

You will see the state of the Designer here:

The top of the Emulator will have this look.


2 My first program 19 Basic4Android Beginner's Guide

Now we will add the 2 Labels for the numbers.


In the Designer add a Label.

The label appears in the Emulator, and its default parameters are listed in the Designer.

Resize and move the Label with the red


squares like this.

The new parameters Left, Top, Width and


Height are directly updated in the Designer.
You can also modify the Left, Top, Width
and Height parameters directly in the
Designer.

Let us change the parameters of this first Label


according to our requirements.
By default, the name is Label with a number,
here Label1, let us change its name to
lblNumber1.
The three letters 'lbl' at the beginning for
Label, and Number1 for the first number.
It is recommended to use significant names for
views so we know directly what kind of view it
is and its purpose.

Pressing Return or clicking elsewhere will also


change the Event Name parameter.
2 My first program 20 Basic4Android Beginner's Guide

We have now:

Main: main module


Name: name of the view
Type: type of the view, Label, this parameter can't of course be changed
Event Name: name of the routine that handles the events of the Label
Parent: parent view the Label belongs to.

Let us check and change the other parameters:

Left, Top, Width and Height are OK.


Enabled, Visible are OK
Tag we leave it empty.
Text, we set a default number, say 5

Typeface, Style are OK


Horizontal Alignment: we set it to
CENTER_HORIZONTAL
Vertical Alignment: we leave
CENTER_VERTICAL.
Size: we set it to 36
We leave all the other parameters as they are.
2 My first program 21 Basic4Android Beginner's Guide

The new parameters.

We need a second label similar to the first one. Instead of adding a new one, we copy the first one
with the same parameters. Only the Name, Left and Top parameters will change.
2 My first program 22 Basic4Android Beginner's Guide

Let us position the new Label and change its name to lblNumber2.

Let us now add a 3rd Label for the math sign. We copy once again lblNumber1.
Click on lblNumber1 in the Emulator, and in the Designer click in the 'Tools' menu on 'Duplicate
Selected View'.

Position it between the two first Labels and change its name to lblMathSign and its Text parameter
to '+'.
2 My first program 23 Basic4Android Beginner's Guide

Now let us add an EditText view. In the Designer click on

Position it below the three Labels and change its name to edtResult. 'edt' for EditText and 'Result'
for its purpose.

Let us change these parameters.


Name to edtResult

Horizontal Alignment to
CENTER_HORIZONTAL
Text Size to 30

Input Type to NUMBERS


Hint Text to 'Enter result'
2 My first program 24 Basic4Android Beginner's Guide

Let us add the Button to confirm the result or to generate a new calculation.

Position it below the EditText view; resize it and change following parameters:

Name: to 'btnAction'

Text: to 'O K' and

Text Size to 24.


2 My first program 25 Basic4Android Beginner's Guide

Let us add the last Label for the comments, position it below the Button and resize it.

Change the following parameters:


Name to lblComments

Horizontal Alignment:
CENTER_HORIZONTAL
Text Color to Black
Color to White
Alpha to 255

By default, the Label background color is black


and transparent. We set it to white and opaque
Alpha = 255.
We set the Text color to black.
2 My first program 26 Basic4Android Beginner's Guide

Let us save the layout in a file.

Click on and save it with the name 'Main'.

Click on .

To write the routines for the project we need to reference the views in the code.
This can be done with the Generate Members tool in the Designer.
2 My first program 27 Basic4Android Beginner's Guide

The Generate Members tool allows to automatically generate references and subroutine frames.

Click on to open the generator.

Here we find all the views added to the current layout.


We check all views and check the Click event for the btnAction Button.
Checking a view generates its reference in the Globals Sub in the code. This is
needed to make the view recognized and allow the autocomplete function.

Clicking on en event of a view generates the Sub frame for this event.

Click on to generate the references and sub frame and .


2 My first program 28 Basic4Android Beginner's Guide

Now we go back to the IDE to enter the code.

First, we need to load our layout file to the Activity in the Activity_Create Sub.

- Enter 'Activity'

- Enter a dot

- The autocomplete function shows automatically all the possible parameters of the view.
- Enter 'L' , the autocomplete function shows the parameters beginning with 'L'

- Press the down arrow key, LoadLayout will appear with the online help for the given parameter or
method.
2 My first program 29 Basic4Android Beginner's Guide

- Press 'Return', LoadLayout is added.

- Enter '(', the online help is displayed showing the needed parameters for the method.

- Enter '"Main")'

We want to generate a new problem directly when the program starts. Therefore, we add a call to
the New subroutine.

To generate a new problem, that means generate two random numbers Number1 and Number2
between 1 and 9 and show them in the lblNumber1 and lblNumber2 Labels.

To do this we enter following code:


In Sub Globals we add two variables for the two numbers.

And the 'New' Subroutine:

Rnd(1, 10) Random number generator, '1' min. number inclusive and '10' max. number exclusive.
lblComments.Text = "Enter the result" & CRLF & "and click on OK"
Displays the comment in lblComments. CRLF is the LineFeed character.
2 My first program 30 Basic4Android Beginner's Guide

Now we add the code for the Button click event.

We have two cases:


- When the Button text is equal to "O K" this means that a new problem is proposed and the
program waits for the user entering a result and then pressing the Button.
- When the Button text is equal to "NEW" this means that the user has entered a correct answer and
when the user clicks on the Button a new problem will be generated.

If btnAction.Text = "O K" Then checks if the Button text equals "O K"
If yes then we check if the EditText is empty.
If yes, we display a MessageBox telling the user that there is no result in the EditText view.
If no, we check if the result is correct or if it is false.
If no then we generate a new problem, set the Button text to "O K" and clear the EditText view.

The last routine is the checking of the result.

With If edtResult.Text = Number1 + Number2 Then we check if the result is OK.

If yes, we display in the lblComments label the text below:


'G O O D result'
'Click on NEW'
and we change the Button text to "N E W ".
If no, we display in the lblComments label the text below:
W R O N G result
Enter a new result
and click OK
2 My first program 31 Basic4Android Beginner's Guide

Let us now compile the program and transfer it to the Emulator.

We have not yet set the package name so the IDE asks for it. Enter B4A.MyFirstProgram.

Click on .

We need also to enter the Label name

Click on .

These two parameters can also be changed in the IDE in the Project menu.

The program is going to be compiled.

When you see 'Completed successfully.' in above message box, the compiling and transfer is
finished.

Look at the emulator, you should see something similar to the image below, with different numbers.
2 My first program 32 Basic4Android Beginner's Guide

Of course, we could make aesthetic


improvements in the layout, but this was not the
main issue for the first program.

One disadvantage of the current layout is the


covering of the comment label by the virtual
keyboard.

This will be improved in the next chapter


'Second program'.

We will add a specific keyboard.


3 Second program 33 Basic4Android Beginner's Guide

3 Second program (SecondProgram.b4a)


Improvements of My first program.

Create a new folder SecondProgram. Copy the all the files and folders from MyFirstProgram to the
new SecondProgram folder and rename the program file MyFirstProgram.b4a to
SecondProgram.b4a .

Load this new program in the IDE.

Run the Designer and connect it to the


Emulator.

Let us add a numeric keyboard to the layout


to avoid the use of the virtual keyboard.

We need to change the Package Name.

In the IDE Project menu.

Click on 'Project Name'

Change the name to


B4A.SecondProgram.

Click on .

And change the Application Label.


Click on 'Application Label' in the same menu.

Change the name to


SecondProgram.

Click on .
3 Second program 34 Basic4Android Beginner's Guide

We want to replace the edtResult EditText view by a new Label.

In the Emulator and the Designer.

Click on the edtResult view.

Click on

Click on lblNumber1 to select it.

Duplicate it
3 Second program 35 Basic4Android Beginner's Guide

Move it between the upper labels and the


button and resize it.

Modify following parameters:

Name to lblResult

Text to " " blank character

Text Color to Black

Corner Radius to 5
Color to White
Alpha to 255
3 Second program 36 Basic4Android Beginner's Guide

Let us add a Panel for the keyboard buttons.

Position and resize it as in the image.

Change its name to pnlKeyboard


"pnl" for Panel, the view type.

Change Corner Radius to 0


3 Second program 37 Basic4Android Beginner's Guide

We will move the O K button from the


Activity to the pnlKeyboard Panel.

Click on

The button belongs now to the Panel

Move Label lblComments up near Label


lblResult and increase the height of Panel
pnlKeyboard like in the image.
3 Second program 38 Basic4Android Beginner's Guide

Click on the pnlKeyboard panel to select it.

Click on
to add a new button.

The new button is added.

Change following parameters.

Name to btn0
Event name to btnEvent

Left to 10
Top to 120
Width to 55
Height to 55

Tag to 0
Text to 0

Size to 24

Now we want to change the button colors.

Click on StatelistDrawable.

Click on GradientDrawable
3 Second program 39 Basic4Android Beginner's Guide

Change the following parameters.

Orientation to TOP_BOTTOM
First Color
Second Color

Pressed Drawable to GradientDrawable

Orientation to TOP_BOTTOM
First Color
Second Color

The button looks now like this.

Let us duplicate btn0 and position it besides


button btn0.

Change following parameters.

Name to btn1

Tag to 1
Text to 1

Let us add 8 more Buttons and position them


like in the image.

Change following parameters:


Name btn2, btn3, btn4 etc
Tag 2 , 3 , 4 etc
Text 2 , 3 , 4 etc
3 Second program 40 Basic4Android Beginner's Guide

Duplicate one of the number buttons, and


position it like in the image.

Resize and position btnOK.

Change the pnlKeyboard Color to Black.

Change their Name, Tag, Text and Color


parameters as below.

btnBS < btnOK OK


3 Second program 41 Basic4Android Beginner's Guide

The finished new layout.

Now we will update the code.


First, we must replace the edtResult by lblResult because we replaced the EditText view by a Label.

Click on edtResult to select it.

Click on Find(F3)
3 Second program 42 Basic4Android Beginner's Guide

Click on

Click on and .

We need also to change its view type form EditText to Label.

Now we write the routine, that handles the Click events of the Buttons.
The Event Name for all buttons, excepted btnAction, is "btnEvent".
The routine name will become btnEvent_Click, let us enter following code:

We need to know what button raised the event. For this, we use the Sender object which is a special
object that holds the object reference of the view that generated the event in the event routine.

To have access to the parameters of the view that raised the


event we declare a local view variable Dim Send As Button.
And set Send = Sender.

Then to make the difference between the backspace button and


the numeric buttons we use a Select / Case / End Select
structure and use the Tag parameter of the buttons. Remember,
when we added the different buttons we set their Tag parameter
to BS, 0, 1, 2 etc.

Select Send.Tag sets the variable to test.


Case "BS" checks if it is the button with the "BS" tag value.
Case Else handles all the other buttons.
3 Second program 43 Basic4Android Beginner's Guide

Now we add the code for the numeric buttons.


We want to add the value of the button to the text in the lblResult Label.

This is done in line 75 with


lblResult.Text = lblResult.Text & Send.Tag

The "&" character means concatenation, so we just append to the already existing text the Tag value
of the button that raised the event.

Now we add the code for the BackSpace button.

When clicking on the BS button we must remove the last character from the existing text in
lblResult.
However, this is only valid if the length of the text is bigger than 0. This is checked with:
If lblResult.Text.Length >0 Then

To remove the last character we use the SubString2 function.


lblResult.Text = lblResult.Text.SubString2(0,lblResult.Text.Length - 1)

SubString2(BeginIndex, EndIndex) extracts a new string beginning at BeginIndex (inclusive) until


EndIndex (exclucive).

Now the whole routine is finished.


3 Second program 44 Basic4Android Beginner's Guide

We can try to improve the user interface of the program in adding some colors to the lblComments
Label.
Let us set:
- Yellow for a new problem
- Light Green for a GOOD answer
- Light Red for a WRONG answer.

Let us first modify the New routine, where we add line 55.

And in the CheckResult routine we add lines 62 and 66.


3 Second program 45 Basic4Android Beginner's Guide

Another improvement would be to hide the '0' button to avoid entering a leading '0'.
For this, we hide the button in the New subroutine in line 57.

In addition, in the btnEvent_Click subroutine, we hide the button if the length of the text in
lblResult is equal to zero and show it if the length is higher than zero, lines 85 to 89.

As we are accessing btn0 in the code we need to declare it in the Globals routine.

Modify line 12 like below:


4 The IDE 46 Basic4Android Beginner's Guide

4 The IDE
The Integrated Development Environment.

When you run the IDE you will get a form like the image below:
Example: SecondProgram.b4a.
4 The IDE 47 Basic4Android Beginner's Guide

4.1 Menu and Toolbar

4.1.1 Toolbar

Generates a new empty project.


Loads a project.
Saves the current project.
Copies the selected text to the clipboard.
Cuts the selected text and copies it to the clipboard.
Pastes the text in the clipboard at the cursor position.
Undoes the last operation.
Redoes the previous operation.
Activates the Find and Replace function.
Sets the selected lines as comments.
Uncomments the selected lines.
Adds a bookmark.
Removes a bookmark.
Go back to the previous bookmark.
Go forward to the next bookmark.
Autocomplete function Ctrl + space.
Decrease the indentation of the selected lines.
Increase the indentation of the selected lines.
Runs the compiler.
4 The IDE 48 Basic4Android Beginner's Guide

4.1.2 File menu

New Generates a new empty project.


Open Source Loads a project.
Save Saves the current project.
Export As Zip Exports the whole project in a
zip file.
Page Setup Pages setup for printing
Print Preview Shows a print preview.
Print Prints the code.

List of the last loaded programs.

4.1.3 Edit menu

Cut Cuts the selected text and copies it to the clipboard.


Cut Line Cuts the line at the cursor position.
Copy Copies the selected text to the clipboard.
Paste Pastes the text in the clipboard at the cursor position.

Undo Undoes the last operation.


Redo Redoes the previous operation.
Find Activates the Find and Replace function.

Block Comment Sets the selected lines as comments.


Block Uncomment Uncomments the selected lines.

Remove All Bookmarks Bookmarks.


Remove All Breakpoints Breakpoints.

Outlining Collapse the whole code.


4 The IDE 49 Basic4Android Beginner's Guide

4.1.4 Project menu

Adds a new module


Add an existing module

Changes the module name


Removes the current module
Hides the current module

Activity properties, see below.

Chooses an icon for the program.


Changes the package name.
Changes the Application name.
Changes the Application version.

Checked, the program is installed on an external storage.


Orientations supported, see below.

Different compiling modes.

Debugging

Activity properties

The program can be full screen or not


The program can include the title bar or not.

Orientations supported

Both modes.
Portrait only.
Landscape only.
4 The IDE 50 Basic4Android Beginner's Guide

4.1.5 Tools menu

IDE Options see below

Clean Files Folder (unused files) see next page


Clean Project see next page
Run AVD Manager

Configure Paths

Take Screenshot see next page

Change Tab size.


Change Font., not recommended.

Word wrap, see below.

Auto Save, see below.


Show Tooltips, see below.
Configure Process Timeout

Word wrap

Without word wrap. The end of the line is hidden.

With word wrap. The end of the line is wrapped to the next line.

Auto Save

Saves the program when you run it.

Show Tooltips During Typing

Show Tooltips checked.

Show Tooltips unchecked.


4 The IDE 51 Basic4Android Beginner's Guide

Take Screenshot

The function can be called from the:


 Tools menu when the IDE is in edit mode
 Debug menu when the IDE is in debug mode

Clicking on

shows this window.

Click on to take the screenshot


picture from the device or the emulator.

You can save the image with


as a PNG file.

And you can change the orientation


of the picture.

Clean Files Folder (unused files)


Deletes files that are located under the Files folder but are not used by the project (it will not delete
any file reference by any of the project layouts). A list of unused files will be displayed before
deletion (and allows you to cancel the operation).

Clean Project Deletes all generated the files that are generated during compilation.
4 The IDE / 4.2 Code area 52 Basic4Android Beginner's Guide

4.2 Code area


The code of the selected module is displayed in this area and can be edited.
The examples below are based on the code of the SecondProgram.

4.2.1 Undo – Redo


In the IDE it is possible to undo the previous operations and redo undone operations.
Click on to undo and on to redo.

4.2.2 Collapse a subroutine


In the IDE a subroutine can be collapsed to minimize the number of lines displayed.

The btnAction_Click routine expanded.

Click on the small square left to


Sub to collapse the subroutine.

The btnAction_Click routine collapsed.

Hovering with the mouse over the collapsed routine name shows its content.
4 The IDE / 4.2 Code area 53 Basic4Android Beginner's Guide

4.2.3 Collapse a Region

In the code you can define regions and collaps these.

Example:

#Region GPS sets the beginning of a region and


#End Region the end

Then you can add the subroutines between the two limits:

Then clicking on

collapses the whole region.

Hovering over GPS

shows the beginning of the code, not all the routines in the region.
4 The IDE / 4.2 Code area 54 Basic4Android Beginner's Guide

4.2.4 Collapse the whole code

In the Edit menu there are two


functions allowing collapsing or
expanding the whole code.

The whole code collapsed.

Hovering with the mouse over a


subroutine still shows the
beginning of its content.
4 The IDE / 4.2 Code area 55 Basic4Android Beginner's Guide

4.2.5 Commenting and uncommenting code

A selected part of the code can be set to comment lines or set to normal.

Original code

Select the code.

Click on .

Lines set as comments.

To set the lines to normal.


Select the lines and click on .

4.2.6 Bookmarks

You can set 'bookmarks' everywhere in the code and jump forward and backwards between these
bookmarks.

To set a bookmark, position the cursor on the


desired line, 12 in this example.

Click on .

The bookmark sign is displayed in the left


margin.
To remove a bookmark, position the cursor
on the line and click on .

Click on to jump forward to the next bookmark.

Click on to jump backward to the previous bookmark.

In the menu you can remove all bookmarks


4 The IDE / 4.2 Code area 56 Basic4Android Beginner's Guide

4.2.7 Indentation

A good practice is to use the indentation of code parts.


For example for subroutines, loops, structures etc.

This code is difficult to read because the


structure of the code is not obvious.

This code is much easier to read,


the structure of the code is in
evidence.

A tabulation value of 2 for the


indentation is a good value.

Example with an
indentation of 4

Personally, I prefer a value


of 2.
4 The IDE / 4.2 Code area 57 Basic4Android Beginner's Guide

Whole blocks of code can be indented forth and back at once.

Original code

Select the code block.

Click on .

The whole block has moved one tabulation to the


right.

To move a block to the left.


Select the code and click on .

The indentation value can be changed in the Tools menu.

Enter the value and click on .


4 The IDE / 4.2 Code area 58 Basic4Android Beginner's Guide

4.2.8 Autocomplete

A very useful tool is the autocomplete function.


Example:

Let us write lblN

Press on Ctrl + Space or click on .

All variables, views and parameter names


beginning with the letters already written are
shown in a popup menu with the online help
for the highlighted variable, view or
parameter name.
To choose lblNumber1 press Return.

To choose lblNumber2 press the down


arrow and press Return.

The selected name is completed.

After pressing "." all parameters and methods are


displayed in a popup menu.

When selecting an item, the


internal help is displayed

Pressing on the up / down


arrows selects the previous
or next item with its help.

Pressing a character updates


the list and shows the
parameter beginning with
that character.

The best way to learn it is to 'play' with it.


4 The IDE / 4.2 Code area 59 Basic4Android Beginner's Guide

A second Autocomplete function allows you to create event subroutines.

Enter the Sub word plus a blank character.

Press Tab.

Select the type, Button in our example.

Select the type, Click in our example.

The subroutine frame is generated.

Modify 'EventName' to the EventName of the button, 'bntOK' in our case.

The routine is ready.


4 The IDE / 4.2 Code area 60 Basic4Android Beginner's Guide

4.2.9 Jump to a subroutine

Sometimes it is useful to jump from a subroutine call to the subroutine definition.


This can easily be done :

 Select the text of the subroutine call.

 Right click on the selected text.

 Click on Goto Sub Declaration

 And you are there.


4 The IDE / 4.2 Code area 61 Basic4Android Beginner's Guide

4.2.10 Highlighting occurences of words

When selecting a word, this one is highlighted in dark blue and all the occurences in the code are
highlighted in light blue and in the scrollview on the right side.
With the slider you can move up or down the code to go to the other occurences.

The same happens with Breakpoints.


4 The IDE / 4.2 Code area 62 Basic4Android Beginner's Guide

4.2.11 Debugging

To allow debugging you must activate the Debugger option.

In the IDE in the Project menu

Check Include Debug Information.


Check Attach Debugger.

If this option is checked then the compiled code will contain debugging code.
The debugging code allows the IDE to connect to the program and inspect it while it runs.
When the program starts, it will wait for up to 10 seconds for the IDE to connect. Usually the IDE
will connect immediately. However if you run your program manually from the phone you will see
it waiting.
The name of the compiled APK file will end with _DEBUG.apk. You should not distribute this apk
file as it contains the debugging code which adds a significant overhead.

Another relevant option in this menu is Include Debug Information. This option doesn't have any
effect when the Attach Debugger option is checked.
When Attach Debugger is not checked (which means that debugging code will not be added) this
option determines whether the original B4A code will be added to the compiled APK file. Adding
B4A code is useful for one specific reason. During an exception the message will include the
original B4A line and not just the Java line.

When we run the program with Attach Debugger checked, the IDE will open the debugger module
at the bottom of the screen:

Notes about the debugger:


 Breakpoints in the following subs will be ignored: Globals, Process_Globals and
Activity_Pause.
 Services - Breakpoints that appear after a call to StartService will be ignored. Breakpoints
set in Service_Create and Service_Start will pause the program for up to a specific time
(about 12 seconds). This is to avoid the OS from killing the Service.
 Events that fire when the program is paused will be executed. Breakpoints in the event code
will be ignored (only when the program is already paused).
 The data sent from the device to the IDE is limited in size. Long strings may be truncated.
 When the debugger is running, the IDE is read-only. The user cannot change any of the
program text.
4 The IDE / 4.2 Code area 63 Basic4Android Beginner's Guide

The two major utilities for debugging are:

Breakpoints - You can mark lines of codes as breakpoints. This is done by pressing on the grey area
left of the line.
The program will pause when it reaches a breakpoint and will allow you to inspect the current state.

Logging - The Logs tab at the right pane is very useful. It shows messages related to the
components life cycle and it can also show messages that are printed with the Log keyword. You
should press on the Connect button to connect to the device logs. Note that there is a Filter
checkbox. When it is checked you will only see messages related to your program. When it is
unchecked you will see all the messages running in the system. If you are encountering an error and
do not see any relevant message in the log, it is worth unchecking the filter option and looking for
an error message.
Note that the log is maintained by the device. When you connect to a device you will also see
previous messages.
4 The IDE / 4.2 Code area 64 Basic4Android Beginner's Guide

4.2.12 Breakpoints

Clicking on a line in the left margin adds a breakpoint. When the program is running it stops
running at the first breakpoint.

Run the program, the program stops at the breakpoint and the IDE looks like below. The breakpoint
line is highlighted in yellow.

.
At the bottom of the IDE you find other information.

Debugger is connected.
Double click to detach the Debuger.

Name of the routine where the program stopped.


New routine at line 52.

Calling routine of the New routine.


Activity_Create routine in line 24.

Clicking on these links jumps the cursor to the given line.


4 The IDE / 4.2 Code area 65 Basic4Android Beginner's Guide

Continue code execution equivalent to F5.


Continues the execution until the end or the next breakpoint.
Step to the next line equivalent to F8.
Continues the execution to the next line, very interesting during debugging to see the
real program flow and the evolution of variable values.
Pause the code as soon as possible.
Stop the current program equivalent to F11.
Stops also the program in the Emulator.
Stopping the program in the Emulator doesn't stop it in the IDE !

Global variables.

List of the global


objects and variables
used by the program
with their values and
parameters.

Examples:
btnAction: Type = Button Left = 190 Top = 0 Width = 115 Height = 55 Tag = empty Text = OK
Number1 = 6

Local variables.

None in this example.

Hovering with the mouse over a variable shows


its value.

Hovering with the mouse over a view shows its parameters like in the list.
4 The IDE / 4.2 Code area 66 Basic4Android Beginner's Guide

Let us run the program step by step:

Set a breakpoint at line 50.

Run the program click on or F5.

The program will stop at line 50.

Values of the two numbers in the


Global variables window,
it has been reduced to just show the two numbers.

Click on F8.
The program executes the next code line.

The value of Number1 has changed !

Click on F8.
The program executes the next code line.

The value of Number2 has changed !


4 The IDE / 4.3 Tabs 67 Basic4Android Beginner's Guide

4.3 Tabs

There are 4 tabs at the bottom right corner of the IDE that
displays the followin information.

4.3.1 Module and subroutine lists


All the modules of the project and all subroutines of the selected module are listed in two lists at the
right of the IDE.

Module list
Clicking on a module shows its code in the code area.

Subroutine list of the selected module


Clicking on a subroutine shows its code in the middle of
the code area.

In the IDE, in the bottom right corner.


4 The IDE / 4.3 Tabs 68 Basic4Android Beginner's Guide

4.3.2 Files
This window lists all the files that have been added to the project.
These files are saved in the Files.DirAssets folder.
These can be any kind of files: layouts, images, texts, etc.

Click on to add files to the list.


The files in that folder can be accessed with
File.DirAssets.

In the IDE, in the bottom right corner.

Checking one or more files enables the

button.
Clicking on this button removes the selected files from the
list and from the Files folder of the project.

Make shure to have a copy of the files you remove, because they are removed from the Files
folder, but not transfered to the recycle bin, that meas they are definitively lost if you don't
have a copy.

See chapter Files for file handling.


4 The IDE / 4.3 Tabs 69 Basic4Android Beginner's Guide

4.3.3 Logs

Display of Log comments generated by the program when it is running.

We add the two lines 51 and 53 in the program 'SecondProgram' in the 'New' routine.

Run the program.

Click on to connect the logger.

In the window we see the flow of the


program.

Activity (main) Create, isFirst = true


First log message
Second log message
Activity (main) Resume

In the IDE, in the bottom right corner.

When it is checked you will only see messages related to your program. When it is
unchecked you will see all the messages running in the system. If you are encountering an error and
do not see any relevant message in the log, it is worth unchecking the filter option and looking for
an error message

Click to clear the Logs window.

If the debugger is still running, select Debug > Stop from the IDE menu, press F11 or click on

so the code can be edited.


4 The IDE / 4.3 Tabs 70 Basic4Android Beginner's Guide

4.3.4 Libs

List of the available libraries that can be used in the project.

Check the libraries you need for your project.


Make sure that you have the latest version of the libraries.

In the IDE, in the bottom right corner.

The documentation for libraries can be found here:


Basic4android - Android programming with Gui designer
5 Screen sizes and resolutions 71 Basic4Android Beginner's Guide

5 Screen sizes and resolutions


There exist many different screen sizes with different resolutions and pixel densities.
We must make the difference between following parameters.
- Physical screen size Ex: 3.6 '' diagonal
- Resolution in pixels Ex: 320 / 480
- Density pixels per inch Ex: 160

The standard screen is 320 / 480 pixels, density 160 pixels/inch.


There exist other screens with almost the same physical size but with a higher resolution for
example 480 / 640 pixels with a density of 240 pixels/inch.
Tablets have bigger physical sizes but can have a density similar to the standard screen.
Example: 7.2 '' screen diagonal, 640 / 960 pixels and a density of 160 pixels/inch.

A non-exhaustive list of screens:

Diagonal Resolution Density Scale W / H Ratio


3.6 320 / 480 160 1 3/2
3.6 480 / 720 240 1.5 3/2
3.9 480 / 800 240 1.5 5/3
3.6 240 / 320 120 0.75 4/3
7.2 640 / 960 160 1 3/2
10 720 / 1280 160 1 16 / 9

Let us compare the following resolutions:


1) 320 / 480 / 160 screen ~3.5'' standard density 160
2) 640 / 960 / 320 screen ~3.5'' density 320
3) 640 / 960 / 160 ~7'' screen standard density 160

In cases 1) and 2) the physical sizes of the screens are the same but the density of the pixels is
different.
In cases 1) and 3) the densities are the same but the physical dimensions of the screen in case 3)
are the double of those of the screen in case 1) giving a surface 4 times bigger.

Let us look at the size of a button with 80 / 80 dip, its physical size.
dips pixels inch
1) 80 80 0.5
2) 80 120 0.5
2) -- 80 0.375 dimension given in pixels not in dips
3) 80 80 0.5

dip = density independent pixel

It is possible to generate special Emulators with special sizes, resolutions and densities.
5 Screen sizes and resolutions 72 Basic4Android Beginner's Guide

A same layout file can fit into different screen resolutions, but with some restrictions.

We will use the TestLayouts program to test the same layout with different screen resolutions.
The source code is in the <Guide>\SourceCode\TestLayouts directory.

The different resolutions are:

Screen Density H / W ratio Height pixels Pixel diff.


resolution
240 / 320 120 4/3 360 - 40
320 / 480 160 3/2 480 0
480 / 800 240 5/3 720 + 80

The reference resolution is 320 / 480 with a density of 160.


If we calculate, for the two other resolutions, the equivalent height using the same H/W ration we
get the equivalent height in pixels and the difference in pixels.
This means that with the same layout file for all three resolutions there will be 40 pixels missing
with the 240/320 resolution and 80 extra pixels with the 480/800 resolution.

The original layout in the standard 320/480 pixels density 160


Emulator is the following.

To make the tests we need three emulators:


- 320 / 480 density 160
- 240 / 320 density 120
- 480 / 800 density 240

If you do not have these emulators, you must create them in the AVD
Manager. Look here to generate an Emulator.

And the code is:

Note that lines 23 and 24 are commented out !


5 Screen sizes and resolutions 73 Basic4Android Beginner's Guide

Tests with the three Emulators with different resolutions and different densities.

480 / 800 240 320 / 480 160 240 / 320 120

The image sizes are reduced by a factor of 0.5 for easier comparison.

What we see:
- with the standard resolution, the image in the emulator is equal to the original layout.
- with the 240/320 resolution we see that there are the 'expected' 40 pixels missing.
- with the 480/800 resolution, we see that there are the 'expected' 80 extra pixel.

The numbers of items in the ListView are the same for all three resolutions.
5 Screen sizes and resolutions 74 Basic4Android Beginner's Guide

Second test with lines 23 and 24 activated.

In line 23 we calculate the top of the pnlToolBox panel according to the screen height.
In line 24 we calculate the ListView height according to the top of the pnlToolBox.

What we see:
- with the standard resolution, the image in the emulator is still equal to the original layout.
- with the 240/320 resolution we see that the buttons are at the bottom of the screen but the
ListView height is shortened.
- with the 480/800 resolution we see that the buttons are at the bottom and the ListView is
higher.

The numbers of items in the ListView are different in the three layouts because the ListView height
has been adapted to the different relative screen heights.

In the first test, the number of items in the ListView were the same !

These examples show that it is not easy to have one layout for different screen resolutions.
In the example above it was relatively easy because the view in the middle is easily adjustable.
5 Screen sizes and resolutions 75 Basic4Android Beginner's Guide

Even when we load the layout file in the three emulators with resolutions 480 / 800, 320 / 480 and
240 / 320 pixels the layout is stretched or shrinked according to the screen size, but we see of course
also the extra and missing pixels depending on the different relative screen heights.

The Android OS autoscale system adjusts the Left, Top, Width, Height, FontSize and other
parameters with the scale factor but does NOT resize the vertical positions nor the heights of the
views proportional to the screen height. The same is valid for the width in landscape mode.
5 Screen sizes and resolutions 76 Basic4Android Beginner's Guide

5.1 Specilal functions like 50%x, 50dip

There are special functions to accomode different screen sizes and resolution.

5.1.1 PerXToCurrent, PerYToCurrent - 50%x

PerXToCurrent(Percentage As Float) or 50%x

PerXToCurrent(50) means 50% of the Activity widht.


It can be written as a shortcut: 50%x.
50%x is equal to Activity.Width * 0.5

PerYToCurrent(30) means 30% of the Activity height.


It can be written as a shortcut: 30%y.
30%y is equal to Activity.Height * 0.3

5.1.2 DipToCurrent - 50dip

DipToCurrent(Length As Int) or 50dip

DipToCurrent calculates a dimension with the given Length according to the scale of the current
device.

DipToCurrent(50) is equal to 50 * DeviceScale


It can be written as a shortcut: 50dip density independant pixel

The 'standard' resolution is 160 dpi (dots per inch) and sacle 1.
No spaces between the number and dip!
If we have a Button with a dimension of 50 * 50 pixels standard scale, to its dimensions we should
set Button1.Width = 50dip and Button1.Height = 50dip.
With a scale of on the Butoon dimension will be:
Scale Pixels
1 50 * 50
1.5 75 * 75

Example:
Dim Button1 As Button
Button1.Initialize("Button1")
Activity.AddView(Button1, 20%x, 30%y, 100dip, 50dip)

The values for the Left, Top, Width and Height properties in the Designer are considered as
dip values.
6 The Emulator 77 Basic4Android Beginner's Guide

6 The Emulator
The Emulator or Virtual Device is a program that simulates devices on the PC.

6.1 Launch an Emulator

To launch an Emulator click in the IDE in the Tools menu on Run AVD Manager.
.

Select the desired emulator.

The portrait Emulator in this case. Click on

Click on
6 The Emulator 78 Basic4Android Beginner's Guide

Wait until the Emulator is ready, this will take quite some time.
6 The Emulator 79 Basic4Android Beginner's Guide

6.2 Generate a new Emulator

Let us add a new Emulator with a resolution of 480 / 800 pixels, density 240.

In the AVD Manager

Click on

Enter the name Emulator 480_800

Select Android 2.2 – API Level 8

Enter 16.

Enter 480 and 800

Click on

Click on .
6 The Emulator 80 Basic4Android Beginner's Guide

Change 160 to 240.

Click on .

Click on .

The new Emulator is added.


6 The Emulator 81 Basic4Android Beginner's Guide

6.3 Emulator problems

Unfortunately, the Emulator is quite slow and sometimes a pain.

When you either run the program or connect the Emulator from the Designer, sometimes you will
see the message below.

You have two options:


- Yes (Oui) to cancel the process.
- No (Non) Continue the process.

Press , most times continuing the process will succeed.

But, even after having clicked on continue, sometimes you will see this message.

Run the program once more, in most cases the Emulator will be connected and work well.

This often happens when the Emulator is still running a program or if the Emulator is still
connected to another project. In this case press the back button until you reach the Emulator's home
screen, and try again.

If this happens, a second time, close the current Emulator and run it again from the AVD Manager.

If the first message above appears too often you can increase the process timeout value.
6 The Emulator 82 Basic4Android Beginner's Guide

6.3.1 Process timeout

In the IDE Tools menu.

Set the ProcessesTimeoutSeconds parameter to a higher value.


I set it to 45 seconds.
7 B4A Bridge 83 Basic4Android Beginner's Guide

7 B4A Bridge
Up until now there were two methods for testing your application during development.
You can either work with the Android emulator or if your device supports ADB debugging, you
were able to connect to your real device.

The Android emulator is very slow compared to a real device (especially with applications
installation).

Therefore in most cases it is more convenient to work with a real device.


Personally, I'm only using the emulator when working with the visual designer.

However not all devices support ADB debugging. This is exactly the reason for the new B4A-
Bridge tool.
B4A-Bridge is made of two components. One component runs on the device and allows the second
component which is part of the IDE to connect and communicate with the device.
The connection is done over a network (B4A-Bridge cannot work if there is no network available).

Once connected, B4A-Bridge supports all of the IDE features which include: installing applications,
viewing LogCat and the visual designer.

Android doesn't allow applications to quietly install other applications, therefore when you run your
application using B4A-Bridge you will see a dialog asking for your approval.

Getting started with B4A-Bridge

1. First you need to install B4A-Bridge on your device.


B4A-Bridge can be downloaded here: http://www.basic4ppc.com/android/files/b4a_bridge.apk.
B4A-Bridge is also available in Android market. Search for: B4A Bridge.
Note that you need to allow install of applications from "Unknown sources". This is done by
choosing Settings from the Home screen - Manage Applications.

2. Run B4A-Bridge on your device. It will display a screen similar to:

Status will be: Waiting for connections.


7 B4A Bridge 84 Basic4Android Beginner's Guide

3. In the IDE choose Tools - B4A Bridge - Connect.


You will need to enter the IP address that appears on the device screen.

The status bar at the bottom of the screen shows the current status:

That's it.

When B4A-Bridge gets connected it first checks if the designer application needs to be updated. In
that case it will first install the designer application.

B4A-Bridge keeps running as a service until you press on the Stop button.
You can always reach it by opening the notifications screen:

Pressing on the notification will open the main screen.

As mentioned above, when you run an application you are required to approve the installation. You
will usually see the following screens:
7 B4A Bridge 85 Basic4Android Beginner's Guide

In the above dialog you should choose Open to start the application.
If you try to install an existing application signed with a different key, the install will fail (without
any meaningful message). You should first uninstall the existing application. Go to the home screen
- Settings - Applications - Manage applications - choose the application - Uninstall.

Once you finished developing you should press on the Stop button in order to save battery.
Note that B4A-Bridge was written with Basic4android.
The source code is available here: http://www.basic4ppc.com/forum/basic...html#post45854
8 The Designer 86 Basic4Android Beginner's Guide

8 The Designer
The Designer allows generating layouts with either the Emulator or a real device.
8 The Designer / 8.1 The menu 87 Basic4Android Beginner's Guide

8.1 The menu

8.1.1 File menu

New Opens a new empty layout.


Open Opens an existing layout.

Save Saves the current layout.


Save As… Saves the current layout with a new name.
Main Layout file list, in this case only one file, 'Main'.

8.1.2 AddView menu

This menu allows you to select the view you want to add on the
current layout on the device or the Emulator.

Button adds a Button


CheckBox adds a CheckBox
EditText adds an EditText
ImageView adds an ImageView
Label adds a Label
ListView adds a ListView
Panel adds a Panel
ProgressBar adds a ProgressBar
RadioButton adds a RadioButton
ScrollView adds a Scrollview
SeekBar adds a SeekBar
Spinner adds a Spinner
TabHost adds a TabHost
ToggleButton adds a ToggleButton
WebView adds a WebView
8 The Designer / 8.1 The menu 88 Basic4Android Beginner's Guide

8.1.3 The Tools menu

Generate Members Members generator


Bring to Front Brings the selected View to front

Duplicate Selected View Duplicates the selected View


Remove Selected View Removes the selected View

Change Grid Allows to change the grid size


Connect Connects the Emulator or the device
Disconnect Disconnects the Emulator or the device
8 The Designer / 8.2 Tools 89 Basic4Android Beginner's Guide

8.2 Tools

8.2.1 Generate Members


Allows generating Dim statements and frames for subroutines.
The Generate Members tool allows to automatically generate references and subroutine frames.

Click on to open the generator.

Here we find all the views added to the current layout.


We check all views and check the Click event for the btnAction Button.
Checking a view generates its reference in the Globals Sub in the code. This is
needed to make the view recognized and allow the autocomplete function.

Clicking on en event of a view generates the Sub frame for this event.

Click on to generate the references and sub frame and .


8 The Designer / 8.2 Tools 90 Basic4Android Beginner's Guide

8.2.2 BringTo Front

When views are overlapping, the hidden or


partial hidden view can be brought to front.

Click on the view to bring to front to select it.

Click on
to bring the selected view to front.

This is especially interesting with big Panels.

8.2.3 Duplicate Selected View

Click on the view you want to duplicate to


select it.
Click on
to duplicate the view.

The view is duplicated.


8 The Designer / 8.2 Tools 91 Basic4Android Beginner's Guide

8.2.4 Remove Selected View

Click on the view to remove to select it.

Click on
to remove it.

The view has been removed.

Note: Be careful, you will not be asked if you


really want to remove the view.

8.2.5 Change grid

The grid is an invisible grid with a given size. The default grid size is 10 pixels. That means that all
positions and dimensions of a view will be set to values in steps corresponding to the grid size.
Moving a view will be done in steps equal to the grid size.

Click on

You can change the grid size


to the value you want.
8 The Designer / 8.3 General settings 92 Basic4Android Beginner's Guide

8.2.6 Connect device or emulator

Click on to connect a device or an Emulator.

If different devices or Emulators are connected, you will be asked what device or Emulator you
want to connect.

Select the device in the list.

Click on to confirm.

8.3 General settings

Shows the Designer state, in this case the


Designer is connected.

Selects the current view to edit.

When the View combo box is selected, pressing the Up or Down arrows will move through the
views, and the properties for the view will display automatically.

The window can be set to stay always on TOP.


8 The Designer / 8.4 Image files 93 Basic4Android Beginner's Guide

8.4 Image files

You can add image files to the layout.

Click on to select the files(s) to add.

These files will be listed in the Image Files list.

These files are saved to the Files folder of the project.

To remove files, check the files to remove

and click on .
8 The Designer / 8.5 Parameter list 94 Basic4Android Beginner's Guide

8.5 Properties list

List of the properties for the selected view


organized in groups.

All properties can be modified directly in the


list.

All properties in the Main group and some of


the properties in the other groups are common
to all view types.

Explanation of some general properties for all types of Views:

Name Name of the view. It is good practice to give meaningful names. Common
usage is to give a 3 character prefix and add the purpose of the view. In the example, the view is of
type Label and its purpose is to enter a result. So we give it the name "lblResult", "lbl" for
Label and "Result" for the purpose. This does not take much time during the design of the layout
but saves a lot time during coding and maintenance of the program.

Type Type of the view, not editable. It is not possible to change the type of a view.
If you need to, you must remove the view and add a new one.

Event Name Generic name for the subroutines that manages the view's events. By default,
the Event Name is the same as the view's name like in the example. The Events of several Views
can be redirected to a same subroutine. In that case you must enter the name of that routine.
Look at the SecondProgram example for the Click event management for the buttons of the
keyboard, the btnEvent_Click routine.
8 The Designer / 8.5 Parameter list 95 Basic4Android Beginner's Guide

Parent Name of the parent view. Activity, in the example. The parent view can be
changed in selecting the new one in the list.

Left X coordinate of the left edge of the View from the left edge of its parent
View, in pixels (the pixels are in reality dips, density independent pixels).

Top Y coordinate of the upper edge of the View from the upper edge of its parent
View, in pixels (the pixels are in reality dips, density independent pixels).

Width Width of the View in pixels (the pixels are in reality dips, density
independent pixels).

Height Height of the View in pixels (the pixels are in reality dips, density
independent pixels).

Enabled Enables or disables the use of the View Ex: Enabled = True

Visible Determines if the View is visible to the user or not.

Tag This is a place holder which can used to store additional data. Tag can simply
be text but can also be any other kind of object. Tag is used in the SecondProgram example for the
numeric buttons click events management in the btnEvent_Click routine.
8 The Designer / 8.6 Layout variants 96 Basic4Android Beginner's Guide

8.6 Layout variants

Different layout variants can be managed in a same layout file.

Let us make an example based on the TestLayouts project


(which can be found under the Guide\SourceCode\TestLayouts directory):
- Copy the whole TestLayouts folder.
- Rename it to TestLayoutVariants.
- Rename the TestLayout.b4a file to TestLayoutVariants.b4a.
- Run the IDE.
- Run the Emulator (320 * 480 - 160)
- Run the Designer.
- Connect the Designer to the Emulator or the device.

The emulator should look like this.


8 The Designer / 8.6 Layout variants 97 Basic4Android Beginner's Guide

In the Designer, click on .

Select:
480 x 320
scale = 1

Click on

The new variant is added.

Go to the Emulator, press Ctrl + F11, to change it to landscape mode.

It should look like this.


8 The Designer / 8.6 Layout variants 98 Basic4Android Beginner's Guide

The toolbox is not visible, to get it we


select it in the Designer.

And set its Top value to 10.

The Toolbox is now visible.

We need to write code to automatically


rearrange the views when landscape mode
is used.

Button height 65

ListView1:
Width = 380
Height = 220
8 The Designer / 8.6 Layout variants 99 Basic4Android Beginner's Guide

In the code we change the Activity_Create routine from

to

Run the program.

The Emulator should look like this:

Click on Ctrl + F11 to change to portrait >>>

We now have two layout variants in the same layout file.


8 The Designer / 8.6 Layout variants 100 Basic4Android Beginner's Guide

With the 320*240_120 emulator.

We can achieve a similar effect in the Designer when a different Layout Variant is selected and we
switch to Landscape mode (Ctrl-F11).
8 The Designer / 8.8 Adding views by code 101 Basic4Android Beginner's Guide

8.7 The Abstract Designer

The Abstract Designer is a tool that shows the layout in a separate window and is part of the
Designer. It is much faster than the Emulator.
Its main purpose is to create different layout variants.

The different views are not shown with their exact shape but only as coloured rectangles.
Clicking on a view shows its properties in the Designer.

Emulator Abstract Designer


8 The Designer / 8.8 Adding views by code 102 Basic4Android Beginner's Guide

8.7.1 The menu

Layout

Matches :
The chosen variant in the
Designer.
The connected device.

Choice of the most current


screen sizes and resolutions.

Select a resolution and position


the different views according to
the new dimensions and scale.

Zoom

Two possibilities:
50%

100%

Tools

Resize form to fit the layout.

Adds the current layout as a new layout variant in the


Designer.
8 The Designer / 8.8 Adding views by code 103 Basic4Android Beginner's Guide

8.7.2 Example

Let us take a simple example with a layout in portrait mode, like the image below.

Now we would like to make a landscape variant.

Click on Phone (landscape) in the Layout menu

The Designer looks like this:

Click in the Tools menu on


Add Current Layout As New Variant
to add the landscape mode as a new
variant in the layout file.
8 The Designer / 8.8 Adding views by code 104 Basic4Android Beginner's Guide

Now we rearrange the views to fit


the new orientation.

In the Designer we see the new variant.

If you select in the Designer


the previous variant

you will see the screen on the left.


8 The Designer / 8.8 Adding views by code 105 Basic4Android Beginner's Guide

Click, in the Tools menu, on Resize Form To Fit Layout

to resizes the window to fit the layout.


8 The Designer / 8.8 Adding views by code 106 Basic4Android Beginner's Guide

8.8 Adding views by code

It is also possible to add views by code instead of using the Designer with a device, the Emulator or
the Abstract Designer.
Advantage : you have full control of the view.
Disadvantage : you have to define almost everything.

The source code is int the source code directory: AddViewsByCode

For the positions and dimensions of the views on the screen two special writings are available:
 dip density independent pixels.
100dip = DipToCurrent(100) DipToCurrent is a Keyword dip is the Shortcut
100dip = 100 / 160 * device density
The default density is 160 dpi dots per inch (pixels per inch)
Densities in Android:
o 120 scale 0.75
o 160 scale 1 default
o 240 scale 1.5
o 320 scale 2

 %x and %y represent distances proportional to the active screen width and height.
20%x = 0.2 * Activity.Width
90%y = 0.9 * Activity.Height
20%x = PerXToCurrent(20) PerXToCurrent is a Keyword %x is the Shortcut
90%y = PerYToCurrent(90)

Example:
Let us put a Label on top of the screen and a Panel below it with a Label and a Button on it:
13 SQLite Database 107 Basic4Android Beginner's Guide

'Diming' the views.

Dim lblTitle, lblPanelTitle As Label


Dim pnlTest As Panel
Dim btnTest As Button

Initializing the title label:


lblTitle.Initialize("") Initializes the Label, no EventName required.
lblTitle.Color = Colors.Red Sets the Background color to red.
lblTitle.TextSize = 20 Sets the text size to 20.
lblTitle.TextColor = Colors.Blue Sets the text color to blue.
lblTitle.Gravity = Gravity.CENTER_HORIZONTAL + Gravity.CENTER_VERTICAL
Sets the label gravity.
lblTitle.Text = "Title" Sets the label text to 'Title'.
Activity.AddView(lblTitle, 20%x, 10dip, 60%x, 30dip) Adds the view to the activity.

If the Label had been added in the Designer, all the above code wouldn't have been necessary
because the properties would already have been defined in the Designer.
In the Activity.AddView line we see that:
 the Left property is set to 20%x, 20% of Activity.Width.
 the Top property is set to 10dip, 10 density independent pixels.
 the Width property is set to 60%x, 60% of Activity.Width
 the Height property is set to 30dip, 30 density independent pixels.

pnlTest.Initialize("") Initializes the Panel, no EventName required.


pnlTest.Color = Colors.Blue Sets the Background color to blue.

btnTest.Initialize("btnTest") Initializes the Button, EventName = btnTest.


btnTest.Text = "Test" Sets the button text to "Test"
13 SQLite Database 108 Basic4Android Beginner's Guide

lblPanelTitle.Initialize("")
lblPanelTitle.Color = Colors.Red
lblPanelTitle.TextSize = 16
lblPanelTitle.TextColor = Colors.Blue
lblPanelTitle.Gravity = Gravity.CENTER_HORIZONTAL + Gravity.CENTER_VERTICAL
lblPanelTitle.Text = "Panel test"

Similar to the title Label.

Activity.AddView(pnlTest,0,lblTitle.Top + lblTitle.Height + 10dip, 100%x, 50%y)


Adds the Panel pnlTest to the Activity.
 the Left property is set to 0
 the Top property is set to 10dips below the title Label
 the Width property is set to 100%x, the total Activity.Width
 the Height property is set to 50%y, half the Activity.Height
pnlTest.AddView(lblPanelTitle, 20dip, 10dip, 100dip, 30dip)
Adds the Label lblPanelTitle to the Panel pnlTest at the given position and with the given
dimensions in dips.
pnlTest.AddView(btnTest, 50dip, 50dip, 100dip, 60dip)
Adds the Button btnTest to the Panel pnlTest at the given position and with the given dimensions in
dips.

And the result:


9 Process and Activity life cycle 109 Basic4Android Beginner's Guide

9 Process and Activity life cycle


Let's start simple:
Each Basic4android program runs in its own process.
A process has one main thread which is also named the UI thread which lives as long as the process
lives. A process can also have more threads which are useful for background tasks.

A process starts when the user launches your application, assuming that it is not running already in
the background.

The process end is less determinant. It will happen sometime after the user or system has closed all
the activities.
If for example you have one activity and the user pressed on the back key, the activity gets closed.
Later when the phone gets low on memory (and eventually it will happen) the process will quit.
If the user launches your program again and the process was not killed then the same process will
be reused.

A Basic4android application is made of one or more activities. Android support several other
"main" components. These will be added to Basic4android in the future.

Activities are somewhat similar to Windows Forms.

One major difference is that, while an activity is not in the foreground it can be killed in order to
preserve memory. Usually you will want to save the state of the activity before it gets lost. Either in
a persistent storage or in memory that is associated with the process.
Later this activity will be recreated when needed.

Another delicate point happens when there is a major configuration change in the device. The most
common is an orientation change (user rotates the device). When such a change occurs the current
activities are destroyed and then recreated. Now when we create the activity we can create it
according to the new configuration (for example, we now know the new screen dimensions).
9 Process and Activity life cycle 110 Basic4Android Beginner's Guide

How do we handle it?

When you create a new activity you will start with the following code template:

Variables can be either global or local. Local variables are variables that are declared inside a sub
other than Process_Globals or Globals.
Local variables are local to the containing sub. Once the sub ends, these variables no longer exist.
Global variables can be accessed from all subs.

There are two types of global variables.


Process variables and activity variables.

Process variables

These variables live as long as the process lives.


You should declare these variables inside sub Process_Globals.
This sub is called once when the process starts (this is true for all activities, not just the first
activity).
These variables are the only "public" variables. Which means that they can be accessed from other
modules as well.
However, not all types of objects can be declared as process variables.
All of the views for example cannot be declared as process variables.
The reason is that we do not want to hold a reference to objects that should be destroyed together
with the activity.
In other words, when the activity is destroyed, all of the views that are contained in the activity are
destroyed as well. If we didn't do this, and kept a reference to a view after the Activity was
destroyed, the garbage collector would not be able to free the resource and we would have a
memory leak. If we hold a reference to a view, the garbage collector would not be able to free the
resource and we will have a memory leak.
The compiler enforces this requirement.
9 Process and Activity life cycle 111 Basic4Android Beginner's Guide

Activity variables

These variables are owned by the activity.


You should declare these variables inside Sub Globals.
These variables are "private" and can only be accessed from the current activity module.
All object types can be declared as activity variables.
Every time the activity is created, Sub Globals is called (before Activity_Create).
These variables exist as long as the activity exists.

Sub Activity_Create (FirstTime As Boolean)

This sub is called when the activity is created.


The activity is created
 when the user first launches the application
 the device configuration has changed (user rotated the device) and the activity was
destroyed
 when the activity was in the background and the OS decided to destroy it in order to free
memory.
The primary purpose of this sub is to load or create the layout.(among other uses).
The FirstTime parameter tells us if this is the first time that this activity is created. First time relates
to the current process.
You can use FirstTime to run all kinds of initializations related to the process variables.
For example if you have a file with a list of values that you need to read, you can read it if
FirstTime is True and store the list as a process variable by declaring the list in Sub
Process_Globals
Now we know that this list will be available as long as the process lives and there is no need to
reload it even when the activity is recreated.

To summarize, you can test whether FirstTime is True and then initialize the process variables that
are declared in Sub Process_Globals.
9 Process and Activity life cycle 112 Basic4Android Beginner's Guide

Sub Activity_Resume and Sub Activity_Pause (UserClosed As Boolean)

Each time the activity moves from the foreground to the background Activity_Pause is called.
Activity_Pause is also called when the activity is in the foreground and a configuration change
occurs (which leads to the activity getting paused and then destroyed).
Activity_Pause is the last place to save important information.
Generally there are two types of mechanisms that allow you to save the activity state.
Information that is only relevant to the current application instance can be stored in one or more
process variables.
Other information should be stored in a persistent storage (file or database).
For example, if the user changed some settings you should save the changes to a persistent storage
at this point. Otherwise the changes may be lost.

Activity_Resume is called right after Activity_Create finishes or after resuming a paused activity
(activity moved to the background and now it returns to the foreground).
Note that when you open a different activity (by calling StartActivity), the current activity is first
paused and then the other activity will be created if needed and (always) resumed.

As discussed above Activity_Pause is called every time that the activity moves from the foreground
to the background. This can happen because:
1. A different activity was started.
2. The Home button was pressed.
3. A configuration changed event was raised (orientation changed for example).
4. The Back button was pressed.

In scenarios 1 and 2, the activity will be paused and for now kept in memory as it is expected to be
reused later.

In scenario 3 the activity will be paused, destroyed and then created (and resumed) again.

In scenario 4 the activity will be paused and destroyed. Pressing on the Back button is similar to
closing the activity. In this case you do not need to save any instance specific information (the
position of pacman in a PacMan game for example).

The UserClosed parameter will be true in this scenario and false in all other. Note that it will also be
true when you call Activity.Finish. This method pauses and destroys the current activity, similar to
the Back button.

You can use UserClosed parameter to decide which data to save and also whether to reset any
related process variables to their initial state (move pacman position to the center if the position is a
process variable).
10 Variables and objects 113 Basic4Android Beginner's Guide

10 Variables and objects


A variable is a symbolic name given to some known or unknown quantity or information, for the
purpose of allowing the name to be used independently of the information it represents. A variable
name in computer source code usually associated with a data storage location and thus also its
contents, and these may change during the course of program execution. (source Wikipedia)

Basic4android type system is derived directly from Java type system.


There are two types of variables: primitives and non-primitives types.
Primitives include the numeric types: Byte, Short, Int, Long, Float and Double.
Primitives also include: Boolean and Char.

10.1 Variable Types

List of types with their ranges:

B4A Type min value max value


Boolean boolean False True
- 27 27 - 1
Byte integer 8 bits
-128 127
- 2 15 2 15 -1
Short integer 16 bits
- 32768 32767
- 2 31 2 31 -1
Int integer 32 bits
-2147483648 2147483647
- 2 63 2 63 -1
Long long integer 64 bits
-9223372036854775808 9223372036854775807
-149
floating point number -2 (2 -2 -23) * 2 127
Float
32 bits 1.4E-45 3.4028235 E 38
double precision - 2 -1074 (2 -2 -52) * 2 1023
Double number 2.2250738585072014 E - 1.7976931348623157 E
64 bits 308 308
Char character
String array of characters

Primitive types are always passed by value to other subs or when assigned to other variables.
For example:

The variable A = 12
It's passed by value to routine S2
Variable A still equals 12, even though B was changed in routine S2.

Variable B = 12
Its value is changed to B = 45
10 Variables and objects 114 Basic4Android Beginner's Guide

All other types, including arrays of primitives types and strings are categorized as non-primitive
types.
When you pass a non-primitive to a sub or when you assign it to a different variable, a copy of the
reference is passed.
This means that the data itself isn't duplicated.
It is slightly different than passing by reference as you cannot change the reference of the original
variable.

All types can be treated as Objects.


Collections like lists and maps work with Objects and therefore can store any value.
Here is an example of a common mistake, where the developer tries to add several arrays to a list:

10.2 Names of variables

It is up to you give any name to a variable, except reserved words.


A variable name must begin with a letter and must be composed by following characters A-Z, a-z,
0-9, and underscore "_", no spaces, no brackets etc.
Variable names are case insensitive, that means that Index and index refer to the same variable.

But it is good practice to give them meaningful names.


Example:
Interest = Capital * Rate / 100 is meaningful
n1 = n2 * n3 / 100 not meaningful

For Views it is useful to add to the name a three character prefix that defines its type.
Examples:
lblCapital lbl > Label Capital > purpose
edtInterest edt > EditText Interest > purpose
btnNext btn > Button Next > purpose

10.3 Declaring variables

10.3.1 Simple variables

Variables are declared with the Dim keyword followed by the variable name the As keyword and
followed by the variable type. Examples:

Declares three variables as Double,


double precision numbers.

Declares three variables as Int, integer numbers.

Declares three variables as EditText views.

Declares two variables as Button views.


10 Variables and objects 115 Basic4Android Beginner's Guide

The same variables can also be declared in a short way.

The names of the variables separated by commas and followed by the type declaration.

View names must be declared when we want to use them in the code.
If we want, for example, change the text in an EditText view in the code, like
edtCapital.Text = "1200",
we need to reference this EditText view by its name edtCapital, this is done with the Dim
declaration.
If we never make any reference to this EditText view anywhere in the code no declaration is
needed.
Using an event routine for that view doesn't need a declaration either.

To allocate a value to a variable write its name followed by the equal sign and followed by the
value, like:
Capital = 1200
LastName = "SMITH"

Note that for Capital we wrote just 1200 because Capital is a number.
But for LastName we wrote "SMITH" because LastName is a string.
Strings must always be written between double quotes.

10.3.2 Array variables

Arrays are collections of data or objects that can be selected by indices. Arrays can have multiple
dimensions.
The declaration contains the Dim keyword followed by the variable name LastName, the number of
items between brackets (50), the keyword As and the variable type String.

Examples:

One dimension array of strings, total number of items 50.

Two dimensions array of Doubles, total number of items 9.

Three dimensions array of integers, total number of items 150.

The first index of each dimension in an array is 0.


LastName(0), Matrix(0,0), Data(0,0,0)

The last index is equal to the number of items in each dimension minus 1.
LastName(49), Matrix(2,2), Data(2,4,9)
10 Variables and objects 116 Basic4Android Beginner's Guide

or

Example to access all items in the three dimensions array Data:

A more versatile way to declare arrays is to use variables.

We declare the variable Dim NbPers As Int and set its value to 10, NbPers = 10 .
The colon ":" is a separator for two statement on the same line.
Then we declare the arrays with this variable instead of the number 10 as before.
The big advantage is that, if we need one time to change the number of items, we change only ONE
value.

For the Data array we could use the following code.

And the access routine.

Filling an array with the Array keyword :


10 Variables and objects 117 Basic4Android Beginner's Guide

10.3.3 Array of views (objects)

Views or objects can also be in an Array, following code shows an example:


The individual names (b1, b2 etc) must also be 'Dimed'.

In the example below the Buttons are added to the Activity by code.

The Buttons could also have been added in a layout file, in that case they must not be initialized nor
added to the Activity and the Text and Tag properties should also be set in the Designer.
In that case the code would look like this:
10 Variables and objects 118 Basic4Android Beginner's Guide

10.3.4 Type variables

Let us reuse the example with the data of a person.


Instead of declaring each parameter separately, we can define a personal type variable with the
Type keyword:

The new personal type is Person , then we declare either single variables or arrays of this personal
type.
To access a particular item use following code.
CurrentUser.FirstName
CurrentUser.LastName

User(1).LastName
User(1).FirstName

The variable name, followed by a dot and the desired parameter.


If the variable is an array then the name is followed by the desired index between brackets.

It is possible to assign a typed variable to another variable of the same type, as shown below.
10 Variables and objects 119 Basic4Android Beginner's Guide

10.4 Casting

Basic4android casts types automatically as needed. It also converts numbers to strings and vice
versa automatically.
In many cases you need to explicitly cast an Object to a specific type.
This can be done by assigning the Object to a variable of the required type.
For example, Sender keyword references an Object which is the object that raised the event.
The following code changes the color of the pressed button.
Note that there are multiple buttons that share the same event sub.

The above code could also be written more elegantly:


10 Variables and objects 120 Basic4Android Beginner's Guide

10.5 Scope

10.5.1 Process variables

These variables live as long as the process lives.


You should declare these variables inside sub Process_Globals.
This sub is called once when the process starts (this is true for all activities, not just the first
activity).
These variables are the only "public" variables. Which means that they can be accessed from other
modules as well.
However, not all types of objects can be declared as process variables.
All of the views for example cannot be declared as process variables.
The reason is that we do not want to hold a reference to objects that should be destroyed together
with the activity.
In other words, once the activity is being destroyed, all of the views which are contained in the
activity are being destroyed as well.
If we hold a reference to a view, the garbage collector would not be able to free the resource and we
will have a memory leak.
The compiler enforces this requirement.

10.5.2 Activity variables

These variables are contained by the activity.


You should declare these variables inside Sub Globals.
These variables are "private" and can only be accessed from the current activity module.
All object types can be declared as activity variables.
Every time the activity is created, Sub Globals is called (before Activity_Create).
These variables exist as long as the activity exists.

10.5.3 Local variables

Variables declared in a subroutine are local to this subroutine.


They are "private" and can only be accessed from within the subroutine where they were declared.
All objects types can be declared as local variables.
At each call of the subroutine the local variables are initialized to their default value or to any other
value you have defined in the code and are 'destroyed' when the subroutine is left.
10 Variables and objects 121 Basic4Android Beginner's Guide

10.6 Tips

A view can be assigned to a variable so you can easily change the common properties of the view.

For example, the following code disables all views that are direct children of the activity:

If we only want to disable buttons:


11 Modules 122 Basic4Android Beginner's Guide

11 Modules
There does exist at least one module, the main module.
Its name is always Main and cannot be changed.

There do exist three different types of modules:


 Activity modules
 Code modules
 Service modules
11 Modules 123 Basic4Android Beginner's Guide

11.1 Activity modules

Each Activity has its own module. For a better knowledge of Activity life cycle have a look at the
Process and Activity life cycle chapter.

You can add either an axisting module or a new module.

To add a new Activity module click on:

An example is explained in detail in the chapter: Program with 3 Activities.

To access any object or variable in a module other than then module where they were declared you
must add the module name as a prefix to the object or variable name separated by a dot.

Examples from the ThreeActivityExample program:


Variables Value1 and Value2 are declared in Main module in Sub Process_Globals.

To access these variables from another module the name is Main.Value1 or Main.Value2.

It is NOT possible to access any view from another activity module, because when a new activity is
started the current activity is paused and no more accessible !
11 Modules 124 Basic4Android Beginner's Guide

11.2 Code modules

Code modules contain code only. No activity is allowed in Code modules.


The purpose and advantage of code modules is sharing same code in different programs, mainly for
calculations or other general management.
Some code modules, called utilities, are already published be Erel in the forum:
 DBUtils, Android databases are now simple. Database management utilities.
 HttpUtils, Android web services are now simple.
 StateManager, helps managing Android application settings and state.
11 Modules 125 Basic4Android Beginner's Guide

11.3 Service modules

There does exist a Service modules tutorial.


12 Example programs 126 Basic4Android Beginner's Guide

12 Example programs

12.1 User interfaces

Let us make three different user interfaces to select three different screens.

The three user interfaces are:

Menu TabHost view Button toolbox

For each test program there is a Main layout.

For each of the three pages there is a layout file Page1, Page2 and Page3.
Each layout file is loaded to a Panel or a TabHost panel.
These layouts can contain whatever views you need.
12 Example programs 127 Basic4Android Beginner's Guide

12.1.1 Menu example (UserInterfaceMenu.b4a)

The test program is: UserInterfaceMenu.b4a. The code is self explanatory.

1. Each page is on a Panel, pnlPage1, pnlPage2 and pnlPage3.


2. The Panels are added by code.
3. The page layout files are loaded to the Panels.
4. The Menu items are added to the Activity.
5. One Click event routine for each Menu item.
It could also be done in one routine (like in UserInterfaceButtonToolbox.b4a).
12 Example programs 128 Basic4Android Beginner's Guide

12.1.2 TabHost example (UserInterfaceTabHost.b4a)

The test program is: UserInterfaceTabHost.b4a The code is self explanatory.

1. Each page is on a TabHost panel.


2. The TabHost view is in the Main layout.
3. The TabHost panels are added with the Page layout files.
12 Example programs 129 Basic4Android Beginner's Guide

12.1.3 Button toolbox example (UserInterfaceButtonToolbox.b4a)

The test program is: UserInterfaceButtonToolbox.b4a The code is self explanatory.

1. Each page is on a Panel, pnlPage1, pnlPage2 and pnlPage3.


2. The Panels are added by code.
3. The page layout files are loaded to the Panels.
4. The Buttons are in the Main layout on the pnlToolBox panel.
5. One Click event routine for all Buttons.
12.2 Three Activity example program 130 Basic4Android Beginner's Guide

12.2 Program with 3 Activities (ThreeActivityExample.b4a)

The test program is: ThreeActivityExample.b4a

The goal of the program is:


- to show how to manage several Activities.
- working with Process Global variables across different Activities. The variables can be
changed in different activities, but are available over the whole project.
- change layout parameters, in moving a small red panel over the screen.
- save and load the layout parameters of the small red panel with a Map object so the square
will keep the same position after changing a page or restarting the program.

The program looks like below:

We have:
- 3 pages, each one in it's own Activity.
- 3 process global variables, Value1, Value2 and Value3
- on each page 1 EditText view to modify the Value variable with page index.
- 2 Labels to display the two other variables.
- on Page1 a small red square Panel to move around.

We can:
- Change Value1 in Page1.
- Change Value2 in Page2.
- Change Value3 in Page3.
- Move the small red square over the screen.
- Select either Page2 or Page3 on Page1.
12.2 Three Activity example program 131 Basic4Android Beginner's Guide

Let us take the example with the Button toolbox (UserInterfaceButtonToolbox.b4a).


Instead of having our three pages on three panels we will use 3 activities.
Main, Page2 and Page 3.

For this we must create two new Modules: Page2 and Page3.

In the IDE click on.

Enter the name Page2

and click on .

A new module is added to the project.


12.2 Three Activity example program 132 Basic4Android Beginner's Guide

Modify the code of Page2 module as below:

Add now a new module "Page3" the same way as Page2 and modify the code like below:

These codes are self explanatory.


12.2 Three Activity example program 133 Basic4Android Beginner's Guide

Let us modify the code of the Main module:

In Sub Process-Globals we add following variables.


Value1, Value2 and Value3 to save some values.
mapMoveTopLeft as a Map object to save the Left and Top parameter of the small red square.

In Globals we have the variables below:


lblValue2_P1 is the Label to display Value2 on page1.
lblValue3_P1 is the Label to display Value3 on page1.
edtValue1_P1 is the EditText to enter Value1 on page1.
pnlPage1 is the container for the Page1 layout.
pnlMove is the small red square.
X0, Y0, X1 and Y1 are used to memorize initial coordinates when moving the red square.

Sub Activity_Create is modified like below:

When the routine is called the first time, we initialize the three Value variables.
12.2 Three Activity example program 134 Basic4Android Beginner's Guide

In Sub Activity_Resume we initialize the parameters of the views of Activity Main.


Init.txt is the file with the Left and Top parameters of the small red square pnlMove.
If the file does exist we read it and set the Left and Top parameters of pnlMove.
If the file doesn't exist we initialize the Map object and set the two first parameters to the Left and
Top parameters of pnlMove..

When the "Main" Activity is paused, due to either a page change or the program closing, we:
- set variable Value1 to the edtValue1.Text contend.
- save the Map to file Init.txt.

To go back to Page1 from either Page2 or Page3, the user must press the Back key. To avoid that
the program stops when the user clicks, by inadvertence, one time too much, we check in Sub
Activity_KeyPress what key was pressed. And if it's the Back key we display a message in a
MessageBox asking the user if he really wants to quit the program. If Yes, then we set the Return
value to False that means that the event is sent back to the OS to close the program. If the answer is
No, we set the Return value to True, that means that we 'consume' the event and the OS will not
stop the program.
12.2 Three Activity example program 135 Basic4Android Beginner's Guide

To show how to manage layout parameters we have the small red square, pnlMove, that can be
moved on the screen. The position of pnlMove is handled in Sub Activity_Touch where we get
three parameters:
- Action holding the value of the action the user made.
ACTION_DOWN the user touches the screen.
ACTION_MOVE the user moves on the screen
ACTION_UP the user leaves the screen
- X the X coordinate of the finger on the screen.
- Y the Y coordinate of the finger on the screen.

To be able to move pnlMove we do the following:


- when Action is equal to ACTION_DOWN, the user touches the screen
we memorize the coordinates of the finger and the coordinates of the upper left corner of
pnlMove (lines 76 to 79).

- when Action is equal to ACTION_MOVE the user moves his finger on the screen.
we calculate the relative displacement, dX and dY, in both directions and set the new Left
and Top parameters of pnlMove (lines 82 to 85).

- when Action is equal to ACTION_UP, the user leaves the screen


we update the two parameters in the Map object (lines 88 and 89=.
12.2 Three Activity example program 136 Basic4Android Beginner's Guide

In Sub btnPage_Click we start the Page Activity according to what button was pressed.
- We declare a new Button object, Send.
- We attribute Sender to Send .
Sender is the buttom view that raised the event.
- Depending on the Tag value of the sender object we start the correct Activity.

We still need to modify the four layout files:

Main:

We remove btnPage1, as it is no longer needed.


Enlarge the two remaining buttons and reposition them

Page 1:

We add the views like in the image at the left.

Similar for Page 2 and Page 3.

The layout files are in the project.


12.3 Scrollview example program 137 Basic4Android Beginner's Guide

12.3 ScrollView examples

ScrollView is a very versatile view to display lists of objects holding data or user interface views.

ListViews are, currently, limited to two lines of text and an image per data set.

ScrollViews have an internal Panel, bigger than the screen, that can be scrolled vertically and holds
any type of views either as one layout or as lists of view sets.

Some screenshots of examples: ( a summary of ScrollView examples)

Gridline in TableView …Scrollview SQLLiteDB ScrollView, layouts …

Another ScrollView example Add imageview … HelpScrollView


12.3 Scrollview example program 138 Basic4Android Beginner's Guide

12.3.1 ScrollView example program


Let us make a ScrollView example with following functions:

 Read a csv file and display it in a table based on a ScrollView.


 The ScrollView can be scrolled vertically with the standard scrolling function of the
ScrollView.
 The ScrollView can also be scrolled horizontally with a Seekbar or dynamically with the
finger on the lower blue rectangle ( SeekBar visible or not).
 Clicking on a cell highlights the row and the cell, this routine allows adding other functions
related to a row or a cell.
 Clicking on a header, displays the column, this routine allows adding functions related to a
column.
12.3 Scrollview example program 139 Basic4Android Beginner's Guide

We define following variables and their default values:


StringUtils1 Used to read the csv file.
NumberOfColumns Number of columns.
RowHeight Height of a row in the ScrollView.
RowLineWidth Width of the lines between the rows.
RowHeight_1 Internal height of a row
RowHeight_1 = RowHeight - RowLineWidth
ColLineWidth Width of the lines between the columns.
ColumnWidth() Width of the different columns as an array
ColumnWidth_1() Internal width of the different columns.
TotalColumnWidth() Coordinates of the left border of a column as an array.
HeaderColor Headers background color.
HeaderFontColor Headers font color.
HeaderLineColor Headers line color.
LineColor Cell line color.
CellColor Cell background line color.
FontColor Cell font line color.
Alignment Text alignment of the text in the headers and cells.
SelectedRow Index of the selected row.
SelectedRowColor Color of the selected row.
SelectedCellColor Color of the selected cell.
Type RowCol (Row As Int, Col As Int)
Define a custom variable that contains a row and a column index.
MoveLeft0 Used for the horizontal scrolling.
MoveX0 Used for the horizontal scrolling.
MoveX1 Used for the horizontal scrolling.
DeltaScroll Used for the horizontal scrolling.
DeltaX Used for the horizontal scrolling.
Time0 Used for the horizontal scrolling.

Personally, I prefer working with variables rather than with values. The maintenance and
modification of a program is much easier with variables than with values.
12.3 Scrollview example program 140 Basic4Android Beginner's Guide

Now we define the Views for the program:


scvPersons ScrollView to display show the data.
pnlHeader Panel to display the headers.
skbScroll Seekbar to scroll the ScrollView and Header.
pnlScroll Panel for the 'dynamic' horizontal scrolling.
Timer1 Timer used the 'dynamic' horizontal scrolling.
12.3 Scrollview example program 141 Basic4Android Beginner's Guide

Now we initialize the different Views and variables, we:


 Initialize the panel for the horizontal scrolling.
 Initialize the SeekBar for the horizontal scrolling.
 Initialize the ScrollView
 Initialize the internal column width and the left coordinates for each column and the total
width of all columns.
 Initialize the ScrollView width.
 Set the Max parameter for the Seekbar
 Set the index of the selected row to -1, no row selected.
 Load the csv file, set the headers and fill the ScrollView.
 Initialize the Timer for the horizontal scrolling.
12.3 Scrollview example program 142 Basic4Android Beginner's Guide

Then we read the csv file, fill the headers and the table (ScrollView).
 First, if the headers do exist, we read the csv file with the headers.
 Or, if the headers do not exist, we read the csv file without the headers and set default
header names Col1, Col2 etc.
 Get the number of columns.
 Display the headers SetHeader(h).
 Display the table, by adding the different rows to the ScrollView AddRow(row).
12.3 Scrollview example program 143 Basic4Android Beginner's Guide

To display the headers we:


 Initialize the header panel.
 Set the header panel color to the header line color.
 Initialize a Label for each column name.
 Set the different parameters for the labels.
 Add the Labels onto the header panel.
 Add the header panel to the Activity
12.3 Scrollview example program 144 Basic4Android Beginner's Guide

Filling a row of the ScrollView with the AddRow routine:


 First we check if the number of cells is equal to the number of columns.
 Initialize a Label for each cell in the row.
 Set the different parameters of the cell.
 Initialize a RowCol variable, rc, for the label tag.
 Set rc.Row to the row index and rc.Col to the column index.
 Set the label tag to rc.
 Add each label to the ScrollView.
 Set the height of the internal panel of the ScrollView.

Note: an underscore character at the end of a line, like in line 212 means
'continue same instruction next line'.
12.3 Scrollview example program 145 Basic4Android Beginner's Guide

Other functions:
 Cell_Click
Click event of one of the cells in the table.
o Dim rc as a RowCol variable and Dim l as a Label
o Set l equal to the Sender, the View that raised the event
o Set rc equal to the Sender Tag parameter
o Call the SelectRow routine
o Display in the Activities title the row and column indexes and the cell content.

 Header_Click
Click event of one of the header cells in the table.
o Dim l as a Label and Dim col as an integer
o Set I equal to the Sender
o Set col equal to the Sender Tag parameter, which is the column index.
o Display the selected column in the Activity title.
12.3 Scrollview example program 146 Basic4Android Beginner's Guide

 SelectRow
Routine managing the colors showing a selected row and cell.
It is called from the Cell_Click routine
o Dim col as an integer.
o If there is a row selected, set the normal cell color.
o Set the SelectedRow variable to the new selected row index..
o Set the selected row and selected cell colors.
12.3 Scrollview example program 147 Basic4Android Beginner's Guide

 GetView
Gets the Label object for the given row and column.
o Dim l as a Label.
o Gets the View in the given row and column, the view index in the ScrollView panel
is equal to Row * NumberOfColumns + Col .
o Returns the Label.

 GetCell
Gets the text of the Label for the given row and column.
o Gets the View in the given row and column.
o Return the Views Text parameter.

 SetCell (not used in the program)


Sets the text of the Label for the given row and column.
o Gets the View in the given row and column
o Sets the Views Text parameter to the given value

 ClearAll
o Removes all Views (Labels) from the ScrollView Panel
o Sets the ScrollView Panel Height to 0
o Sets the select row index to -1, no row selected
12.3 Scrollview example program 148 Basic4Android Beginner's Guide

 Horizontal moving with the SeekBar


o Sets the Left parameter of the Header panel and the ScrollView.
o The SeekBar Max value was set to
skbScroll.Max = scvPersons.Width - Activity.Width.

 Horizontal scrolling with the scroll panel.


o pnlScroll_Touch and Timer1_Tick.
o I leave it up to you to find how these work.

The basic principle it to calculate the speed between ACTION_DOWN and


ACTION_UP and in the Timer routine to move dynamically the header and the
Scrollview and reducing the speed.
13 SQLite Database 149 Basic4Android Beginner's Guide

13 SQLite Database
The demonstration program is: SQLExample.b4a

What is a database (source Wikipedia Database):


A database is an organized collection of data for one or more purposes, usually in digital form. The
data are typically organized to model relevant aspects of reality (for example, the availability of
rooms in hotels), in a way that supports processes requiring this information (for example, finding a
hotel with vacancies). The term "database" refers both to the way its users view it, and to the logical
and physical materialization of its data, content, in files, computer memory, and computer data
storage. This definition is very general, and is independent of the technology used. However, not
every collection of data is a database; the term database implies that the data is managed to some
level of quality (measured in terms of accuracy, availability, usability, and resilience) and this in
turn often implies the use of a general-purpose Database management system (DBMS). A general-
purpose DBMS is typically a complex software system that meets many usage requirements, and
the databases that it maintains are often large and complex.

The standard database system in Android is SQLite.

The interface between your program and the database is a the SQL language.
The data is stored in tables, each table has a certain number of columns and rows.
Each row contains a data set and the different data of a given set are stored in the columns.

13.1 SQLite Database basics

Some simple SQL instructions.

A very intersting site to learn SQL is this one:W3Schools SQL.

Database initialisation:
SQL1.Initialize(DBDirName, DBFileName, True)
DBDirName = Directory name of the database.
DBFileName = Database file name.
True = Create if necessary False don't create
13 SQLite Database 150 Basic4Android Beginner's Guide

Table creation:
CREATE TABLE TableName ( ID INTEGER PRIMARY KEY, Col1 TEXT, Col2 FLOAT )
Creates a table with the name 'TableName' and three columns:
Column Index Name Variable Type
1 ID INTEGER PRIMARY KEY
2 Col1 TEXT
3 Col2 FLOAT

Different available data types:


INTEGER PRIMARY KEY is a special variable type used for identifiers ID's. It is a long integer
value beginning with 1 and it is incremented by one each time a new data set, with a NULL
parameter for this column, is added to the database.
INTEGER is a 64-bit signed integer number.
FLOAT is a 64-bit IEEE floating point number.
TEXT is a string.
BLOB Binary Large OBject, the value is stored exactly as it was input.
NULL

SQL1.ExecuteNonQuery("CREATE TABLE TableName(ID INTEGER PRIMARY KEY, Col1 TEXT,


Col2 FLOAT")

Adding data:

INSERT INTO TableName VALUES ( NULL, 'Val1', Val2 )

SQL1.ExecuteNonQuery("INSERT INTO TableName VALUES (NULL, 'Val1', Val2")


Text variable must be between two quotes 'Val1', numbers not Val2.

Updating data:

UPDATE TableName Set Col1 = 'Val1', Col2 = Val2 WHERE ID = idVal

SQL1.ExecuteNonQuery("UPDATE TableName Set Col1 = 'Val1', Col2 = Val2 WHERE ID =


idVal")

Reading data:

 The whole database:


SELECT * FROM TableName
Cursor1 = SQL1.ExecuteQuery("SELECT * FROM TableName")

 The whole database and ordering according to a given column:


SELECT * FROM TableName ORDER BY Col1 ASC ascending
Cursor1 = SQL1.ExecuteQuery("SELECT * FROM TableName ORDER BY Col1 ASC")

SELECT * FROM TableName ORDER BY 2 DSC descending


Cursor1 = SQL1.ExecuteQuery("SELECT * FROM TableName ORDER BY 2 DSC")

The column to order can be given either by its name Col1 or its number 2.
The column numbering begins with 1.
13 SQLite Database 151 Basic4Android Beginner's Guide

 Filtering
SELECT * FROM Tablename WHERE Col1 LIKE 'abc' AND Col2 LIKE 123
Cursor1 = SQL1.ExecuteQuery("SELECT * FROM TableName" WHERE Col1 LIKE
'abc%' AND Col2 LIKE 123 ")
The % character can be used as a wildcard:
abc means the exact sequence
%abc means beginning with any characters and ending with abc
abc% means beginning with abc and ending with any characters
%abc% means abc anywhere in the string

 A single column
SELECT Col1 FROM TableName
Cursor1 = SQL1.ExecuteQuery("SELECT Col1 FROM TableName")

 Single entry (value)


SELECT Col1 FROM Tablename WHERE ID = idVal
Cursor1 = SQL1.ExecuteQuery("SELECT Col1 FROM TableName WHERE ID = idVal")

 Single row, where the ID has a given value


SELECT * FROM Tablename WHERE ID = idVal
Cursor1 = SQL1.ExecuteQuery("SELECT * FROM TableName WHERE ID = idVal")

 Max / min value in a column, in the examples the max and min values of the given column.
SELECT max(Col1) FROM Tablename
SELECT min(Col1) FROM Tablename
Cursor1 = SQL1.ExecuteQuery("SELECT max(Col1) FROM TableName")
Cursor1 = SQL1.ExecuteQuery("SELECT min(Col1) FROM TableName")
13 SQLite Database 152 Basic4Android Beginner's Guide

13.2 SQLite Database example program


The SQLite example program is a small database with persons, with First name, Last name,
Address and City as the persons parameters.

The source code of this example is in the SQLExample project.

It is based on the Scrollview example program for the display of the database.

Database view Edit view Filter view

The Edit and Filter panels are created automatically.


13 SQLite Database 153 Basic4Android Beginner's Guide

What we can do:

Ordering according to a given column

Clicking on a header sorts the database accoring to this column in ASC ascending mode.

Default or click on Click on


13 SQLite Database 154 Basic4Android Beginner's Guide

13.2.1 Editing
Selecting a data set we get the screen below.

What we can do:

Click on to delete the current data set.

Click 0n to filter the database.

Long click on to show the Filter view.

Click on to edit the data set.

We get the Editor panel.

Here we can: - Change values

Move to the next data set

Move back to the previous data set.

Add the data set to the database.

Mdify the current data set.

Go back to the main screen.


13 SQLite Database 155 Basic4Android Beginner's Guide

13.2.2 Filtering

In the main view:

A click on filters the database according to the filter parameters.

A click on resets the database to unfiltered.

A long click on or displays the Filter panel.

What can be done:

Enter different filtering parameters.


For example:
- FirstName John
- City Lon%

Filtering AND function.

Clear all parameters.

Filters the database.

Goes back to the previous screen.

There does exist only one person with a first name


John and living in a city beginning with Lon%
(London in our example).
13 SQLite Database 156 Basic4Android Beginner's Guide

If we change the AND parameter to OR. We get two more data sets.
Three persons with a first name of John OR living on a city beginning with Lon…
The active function is displayed in green.

13.2.3 Beginning of the code


Let us define a simple database with persons. Each person has a certain number of parameters,
called a data set or a database entry.
Person:
 First name
 Last name
 Address
 City

It is good practice to add an additional column, called 'ID' with a unique number to differentiate the
data sets.
So the columns are: ID, FirstName, LastName, Address, City

Each column must be given a variable type: INTEGER, TEXT, FLOAT, BLOB .
In our database example we have following types:
ID INTEGER PRIMARY KEY
FirstName TEXT
LastName TEXT
Address TEXT
City TEXT
13 SQLite Database 157 Basic4Android Beginner's Guide

To create a database we must :

- First reference the SQL library in the tab in the lower right corner in the IDE.

- Declare it with a Dim in the Process_Global routine

- Define
o the file name : persons.db
o the directory name : File.DirInternal (File.DirRootExternal)
o the table name : persons

- Declare other variables.

The column names as an Array ColumnName

And some more variables:

ColumnToSort the index of the column to sort


Filter a flag, if the filter function is active or not
FilterType the filter type string, can be either AND or OR
SortDirection an array of strings with the sort direction for each column ASC or DSC
13 SQLite Database 158 Basic4Android Beginner's Guide

- Copy the default database from the DirAssets folder to the DBFileDir folder if it does exist and
initialize the database.

In the Activity_Create routine we check if the database does already exist.


 If it doesn't exist, we check if FirstTime is True and, if yes, we initialize the database and we
create the table.
 If it does exist, we check if FirstTime is True and, if yes, we initialize the database.

 Create the table.


We create the table in a separate routine: Sub SQLTableCreate.

- Generate the Edit and the Filter View. The code below shows only the Edit View generation, the
code for the Filter View is similar.

 Define the Label height LHeight, the EdidText height EHeight and the space THeight
between two following Labels.
 In a loop for each colum:
o Dim, Initialize and add the Label view
o Set the ColumnName to the Label Text parameter
o Dim, Initialize and add the EditText view
o Set the EditText for the first colum to diabled, the ID value cannot be changed.
13 SQLite Database 159 Basic4Android Beginner's Guide

13.2.4 Read the table

The text for the query is generated in the txt variable.


 First we set SELECT * FROM DBTableName to the txt variable.
 Then we add the filter functions in the For / Next loop
 We Dim and Initialize an EditText view
 We set the EditText view to the view with index i from the Edit view that contains a text
to search for in the filter.
 If the text in this EditText view is not empty, we add the filter function
 At the end if there is a filter text we add WHERE to the first text and then add the filter
texts.
 Then we add ORDER BY and the name of the column to sort with its direction
 And finally we read the database.

Without the filter, the query text could look like this:
SELECT * FROM persons ORDER BY ID ASC

and with a filter it could look like this:


SELECT * FROM persons WHERE FirstName LIKE 'John' AND City LIKE 'Lon%'
ORDER BY ID ASC
13 SQLite Database 160 Basic4Android Beginner's Guide

Then we:
 Execute the query and put the result in Cursor1
 Dim the Col array variable.
 Call the SetHeader routine to update the headers.
 Set NumerOfRows to 0
 For each row in the table
o Dim a new Col array variable
o Fill the Col array variable with the values of each data set
o Call the AddRow(Col) routine.
 Close the Cursor
 And set the Activities title to the DBFileName.
13 SQLite Database 161 Basic4Android Beginner's Guide

13.2.5 Modify a data set

We
 Dim the row array variable for the values of a row or data set
 We fill the row array variable with the values of the Text paramter of the EditView views in
the Edit view. The index of the EditView is calculated with i * 2 + 1, the indexes are all
oss numbers. The views with even index numbers are the Labels.
 We set UPDATE DBTableName Set ColumnName(0) = 'row(0)' and add the values for all
the other columns.
 Add WHERE ColumnName(0) = 'value of column 0'
The query text could look like this:
UPDATE persons Set ID = '12', FirstName = 'Jules', LastName =
'VERNE', Address = 'Rue St.Honoré', City = 'Paris' WHERE ID = '12'
13 SQLite Database 162 Basic4Android Beginner's Guide

13.2.6 Add a data set to the database.

 We Dim an array variable row, containing the values of the data set.
 We Dim a new Cursor object
 We get the max value of the ID column
we set SELECT max( ColumnName(0)) FROM DBTableName
equivalent to SELECT max(ID)FROM persons
 and get row(0)

 Then we prepare the query text.


 Set INSERT INTO DBTableName VALUES ( NULL
 We get in a loop the new data set values.
o We Dim an EditText view
o Set it to the corresponding EditText view from the Edit View
o Get its Text parameter, the new data value
o Increment the hh variable by 1 if there is no value
 The final query text could look like this:
INSERT INTO persons VALUES(NULL, 'Jules', 'VERNE', 'Rue St.
Honoré', 'Paris')
The NULL value is entered for the autoincrement of the ID column.

 If there is at least one value missing we display an error message and leave the routine.
13 SQLite Database 163 Basic4Android Beginner's Guide

 Then we call the AddRow(row) routine to add the new data set to the Scrollview.
 And set the Edit button to visible if there is at least one data set in the database.

 We execute the query

 We calculate the new height hh of the inner panel of the scrollview and set it to the
scrollviews ScrollPosition.
 We need to add a DoEvents keyword to force the height update.
13 SQLite Database 164 Basic4Android Beginner's Guide

13.2.7 Delete a data set from the database.

 First we delete the data set from the database


The query text could look like this:
DELETE FROM persons WHERE ID = '12'

 Then we need to update the content of the labels in the rows of the table. That means put the
values of the Text parameters of the Lables in the row above the row to the Label in the row
to delete and so on.

 And finally remove the views of the last row.


 And adjust the height of the internal panel of the scrollview..
13 SQLite Database 165 Basic4Android Beginner's Guide

13.2.8 Positioning of the EditText Views in the Edit panel.

A focus change in the EditText views of the Edit Panel or the Filter Panel, positions this
EditText view on top of the screen.

 We check if the EditText view has got focus.


 If yes, we get the view that got the focus.
 We set the ScrollPosition to the top of the view – 40dip.
14 GPS 166 Basic4Android Beginner's Guide

14 GPS
The GPS library has three objects:
 GPS
 GPSSatellite
 Location

The example program will show several functions of the GPS library and has following functions.
 Connecting the GPS
 Getting and displaying GPS information
 Saving a GPS path
 Display the available satellites
 Showing Google maps
 Show a GPS path on the map

14.1 GPS Library

The GPS LIbrary is part of the basic Basic4Android language.

14.1.1 GPS Object

The GPS object has:


 Members
o GPSEnabled as Boolean [read only]
Tests whether the user has enabled the GPS or not
o Initialize (EventName As String)
Initializes the GPS with its EventName
o LoacationSettingsIntent As android.contend.Intent [read only]
Returns the intent that is used to show the global location settings.

o Start(MinimumTime As Long, MinimumDistance As Float)


Starts listening for events.
MinimumTime The shortest period (in milliseconds) between events.
Pass 0 for highest frequency
MinimumDistance The shortest change in distance (in meters) for which to raise
events. Pass 0 for highest frequency.
o Stop
Stops listening to the GPS. You will usually want to call Stop inside Sub
Activity_Pause.
 Events
o LocationChanged (Location1 As Location)
Raised when a new 'fix' is ready.
o UserEnabled (Enabled As Boolean)
o GpsStatus (Satellites As List)
14 GPS 167 Basic4Android Beginner's Guide

14.1.2 GPS Satellite

The GPSSatellite object holds various information about a GPS satellite. A List with the available
satellites is passed to the GpsSatus event.

Satellite data:
 Azimuth 0 - 360 degrees
 Elevation 0 - 90 degrees
 Prn (Pseudo random number)
 Snr (Signal / noise ratio)
 UsedInFix True if the satellite is used to determine the curreent fix.

14.1.3 GPS Location

A Location object holds various information about a specific GPS fix (position).
In most cases you will work with locations that are passed to the GPS LocationChanged event.
The location object can also be used to calculate distance and bearing to other locations.

The most useful properties.


 Location1.Latitude latitude of the fix in [°]
 Location1.Longitude longitude of the fix in [°]
 Location1.Altitude altitude of the fix in [m]
 Location1.Bearing bearing of the fix in [°]
 Location1.Speed speed of the fix in [m/s]
 Location1.Time time of the fix in in [ticks]

The most useful methods.


 Location1.Initialize
Initializes an empty location.

 Location1.Initialize2 (Latitude As String, Longitude As String)


Initializes a location with the two given values, all the other properties are 0.

 Location1.DistanceTo (TargetLocation As Location) in [m]


Location1.DistanceTo(Location2)
calculates the distance between Location1 and Location2.

 Location1.BearingTo (TargetLocation As Location) in [°]


Location1.BearingTo(Location2)
calculates the bearing from Location1 to Location2.
14 GPS 168 Basic4Android Beginner's Guide

14.2 GPS Program

The GPS example program shows several possibilities of the GPS library and has following
functions :
 Connect the GPS
 Get and display GPS information
 Save a GPS path
 Display the available satellites
 Display Google maps
 Display a GPS path on the map

Google map functions, user settable :


 Display zoom control
 Display scale control
 Display map type control
 Display a path
 Display markers
 Move a marker
 Display coordinates (touch the screen)
 Move the map / Display coordinates (touch the screen and move)

It is designed for smartphones and works only in portrait mode.


It is only available for users who bought Basic4Android, the program takes advantage of libraries
which are not part of the trial version.
The source code of this program is available in the users forum in the GPSExample project.
It is not in the SourceCode directory of this guide to garanty the latest version of the program.

Main screen Google Maps


14 GPS 169 Basic4Android Beginner's Guide

GPS display GPS display plus map

Setup Satellites
14 GPS 170 Basic4Android Beginner's Guide

GPS path data Map with GPS path


14 GPS 171 Basic4Android Beginner's Guide

14.2.1 General explanations

Main screen buttons:

Displays Google maps centerd on the default coordinates (defined in the setup).
If there is a GPS path, this one is displayed, centered and zoomed to show the whole path.

Displays the setup screen.

Activates the GPS and memorizes the fixes depending on the setup.

Shows the available satellites.

Displays the data of a GPS path.

For certain functions, the button color is red when they are activated .

Tooltips for the buttons.

When you touch a button the tooltip is displayed on top


of the screen.

When you release it, the tooltip is hidden.

The function is executed when you release the button


inside the buttons area.

If you release the button outsides its area the function is


not executed, this allows the user to look at the buttons
function without executing it.
14 GPS 172 Basic4Android Beginner's Guide

14.2.2 Setup

The setup screen allows to define setup parameters for the program.

GPS
- min time between two fixes.
- min distance between two fixes.
Enable display of:
- Speed
- Bearing
- Windrose

GPS path units, for the display of the values.


- unit for Altitude m and ft
- unit for Speed m/s, km/h and mile/h
- unit for Distance m, km and mile

Map Default location


- Latitude
- Longitude
- Zoom level
- Draggable Checked means: the map can be moved
Unchecked means: show the coordinates.
GPS
- Show the current GPS location on the map.
- Save the GPS path when the GPS is stopped.
- Draw the GPS path online (not yet implemented)

Map show different controls, marker/line properties


- Display center marker
- Display GPS path markers
- Display the GPS path polyline

- Scale control

- Type control, map ROADMAP or SATELLITE

- Zoom control DEFAULT, SMALL, LARGE

GPS Polyline properties


- Width in pixels
- Color
- Opacity 0 = transparent

GPS Marker properties


- Marker clickabel (not yet implemented)
- Marker draggable
14 GPS 173 Basic4Android Beginner's Guide

14.2.3 GPS display

GPS display.

When activated, the GPS displays following parameters:


 Latitude
 Longitude
 Altitude
 Speed user selectable in the setup
 Bearing user selectable in the setup
 Windrose user selectable in the setup

The minimum time and minimum distance to raise a fix change can be set in the setup screen.
Values of 0 for both parameters give the fastest aquisition frequency.
The number of memorized fixes is displayed in the titlebar.

The map can be displayed at the same time with the current GPS location.

After stopping the GPS the user is asked to save the path giving a file name and a comment.
14 GPS 174 Basic4Android Beginner's Guide

14.2.4 Satellites

The Satellites screen displays the information about the satellites currently received by the GPS.

The displayed data are:


 Azimuth
 Elevation
 Used
 Signal/Noise ratio
14 GPS 175 Basic4Android Beginner's Guide

14.2.5 Map display

The Google map can be displayed on the main screen.

with markers without markers

The following elements can either be displayed or hidden, set in the Setup screen :
 Type control MAP or SATELLITE
 Scale control
 Zoom control
 GPS path (polyline)
 Markers
14 GPS 176 Basic4Android Beginner's Guide

The map can be zoomed with a 'double click'.


Or with the zoom button.

If the map is 'Draggable' then :


 touching and moving (dragging) moves the
map.

If the map is NOT 'Draggable' then


 touching the screen shows the coordinates of
that postition.
 touching and moving (dragging) shows the
coordinates

Changing settings directly when the map is displayed:

Touching the MAP button shows a second button on


top of it.
Moving up into the area of the second button, this one
becomes red, and releasing it changes the map mode
from draggable to coordinates and vice and versa.

Touching the PATH button shows three more buttons


on top of it.
Moving on one of these buttons allows to choose either:
 Polyline of the path with the markers.
 Polyline of the path without the markers.
 No polyline and no markers.
14 GPS 177 Basic4Android Beginner's Guide

14.2.6 GPS path

The data from the GPS can be memorized and saved in files.

General data for the file:


 The filename
 The number of points in the file
 A comment for the path

The data for a GPS fix are:


 Latitude the latitude of the fix [°]
 Longitude the longitude of the fix [°]
 Altitude the altitude of the fix [m]
 Time the time when the fix was taken [tick]
 Bearing the bearing from the previous fix [°]
 Speed the speed between the two fixes [m/s]
 Distance the distance between the two fixes [m]
 Dist tot the total distance from the first fix [m]
 Marker flag if a marker should be shown [-]

The GPS path screen shows the data of the selected GPS path.

The data can be scrolled verticaly, normal ScrollView scrolling, and horizontaly with the slider.
The left column with the ID remains always visible.
14 GPS 178 Basic4Android Beginner's Guide

You can:

Delete the selected file.

Load a GPS path file.

Save the GPS path file.

Delete the selected row.

Filter a path

Clicking on a row selects it or unselects it.

When a row is selected :


 it is highlighted in red.
 a Delete button is displayed allowing to delete this fix.
When a fix is deleted the Speed, Bearing, Distance and Dist Tot values are updated.

Clicking on one of the headers below changes the unit of the displayed values.

Altitude Speed Distance / Dist tot


m ft m/s km/h mile/h m km mile

check / uncheck
Clicking on a marker cell changes between checked and unchecked. Marker
14 GPS 179 Basic4Android Beginner's Guide

GPS path filtering.

When memorizing GPS paths it often happens that there are some point aligned along a straight
line. These points can be removed.
The principle of the program is the following.
 The program looks at 3 successive points.
 Calculates the distance  of the midpoint out of the line between the the two outer points.
 If this distance  is higher than the predefined value the point is selected and can be deleted.



With the file added by defaul Test2.GPP you can test it


yourself.

In this example, Test2.GPP, the number of original


points is 78.
The number of points to filter (delete), with a
distance  of 5 m, is 46.

before filtering after filtering


14 GPS 180 Basic4Android Beginner's Guide

14.2.7 Save GPS path file / KML file

A GPS path can be save either :

 in the program specific GPP format (GPS Path)

 in the Google Earh KML format.

Enter the filename.


The program adds automaticaly the correct suffix.

Enter a comment.

Reminder of the number of points.

The drawback of the kml format is that you loose the


time and speed information for each fix.
The advantag is, you can display the path in Gooegle
Earth.

KML documentation.
14 GPS 181 Basic4Android Beginner's Guide

14.3 GPS Program Code

Not all the code of the program will be explained in this chapter but only some more special
features. Many functions are almost the same as expalined in other examples.

The line numbers in the code snippets in this chapter can be somewhat different from the
latest project.

The program has following modules:


 Main activity module
main screen, GPS screen and GoogleMaps screen.

 Satellites activity module


display of the satellites data.

 Setup activity module


setup screen using a ScrollView with a panel higher than the screen.

 GPSPaths activity module


displays the GPS path data plus loading, saving and editing.

 GPSSave activity module


screen for saving a GPS path file with file name and comment entry.

 GPSModule code module


GPS code used in several activity modules
14 GPS 182 Basic4Android Beginner's Guide

14.3.1 Initialization of the GPS

Android doesn't allow a program to start the GPS automaticaly for security reasons, only the user
can enable it.

If the GPS is disabled, the program must ask the user to enable it, this is done with the following
code (in the btnGPS_Touch routine in the Main module) :

Here we check if the GPS is enabled.


If no, we show a ToastMessage asking the user to enable it and activate the LocationSettings screen
where the user must check the GPS.

Then we can start the GPS with:

Where:
 GPSMinTime = the minimium time before the next fix.
 GPSMinDistance = the minimum distance before the next fix.

To have the quickest sampling of the GPS enter zeros for both parameters : GPS1.Start(0,0)
14 GPS 183 Basic4Android Beginner's Guide

14.3.2 Button with tooltip

The buttons of the program show a tooltip on top of the screen when they are touched.
The views used for this are not Buttons but Panels, because Button don't have the Touch event and
Panels have it.

btnGPS button (panel), in the Main module:


This button acts as a toggle button, GPS ON or OFF with a color change.

- First we dim a BitmapDrawable object that will contain the bitmap to display in the button.
- Select ACTION_DOWN,
- Check if GPS is OFF (GPS_On = False) or ON (GPS_On = True)
- Load the corresponding bitmap and
- Set it to the buttons background.

- Select ACTION_UP
- Check if the touch coordinates are within the button area. If yes we execute the function.
- Change the GPS_On variable
- Check if GPS_On = False (GPS disabled) we
14 GPS 184 Basic4Android Beginner's Guide

- Load the corresponding bitmap (blue image)


- Stop the GPS
- Release the phone keep alive function
- Check if there are GPS path data GPSPath.Size > 0
- Check if saving GPS pata data is selected
- Start the GPS path data saving Activity
- If not
- Display a MessageBox
- Load the previous GPS path
- Show the GoogleMap

- If GPS_On = True (GPS enabled) we


- Load the corresponding bitmap (red image)
- Check if the GPS is not enabled on the phone
- Diplay a ToastMessage inviting the user to enable the GPS
- Call the phone setup to let the user enable the GPS
- Initialize the GPSPath data list
- Check if the Map_On = True, map displayed
- Set the Zoom level, center lat and long to the default values
- Update the map the new parameters
- Set the PhoneAwake function, the False parameter indicates no bright screen
- set the different display labels to "- - -", no value
- Start the GPS, GPSMinTime and GPSMinDistance are defined in the setup screen.
14 GPS 185 Basic4Android Beginner's Guide

- Then show the different display labels according to setup settings.


- Set the background image
- Hide the tooltip.
14 GPS 186 Basic4Android Beginner's Guide

14.3.3 Button with tooltip and additional buttons

btnGPSPath button (panel), in the Main module:

This button starts the GPSPaths avtivity,


or if the map is displayed shows three more buttons that
allow to change the following map setup parameters:
 Display the markers and the polyline of the GPS
path on the map
 Display only the polyline, no markers, of the
GPS path on the map
 Display only the map
The three upper buttons are on a Panel,
pnlGPSPathToolbox.

- First we dim four BitmapDrawable objects for the background images.


- Select Activity ACTION_DOWN
- Show the tooltip
- Load the red image bitmap
- Set the button background image
- Check if the map is displayed
- If yes, we show the pnlGPSPathToolbox panel with the three supplementary buttons.
14 GPS 187 Basic4Android Beginner's Guide

In this part we check if the move coordinates are in the area of a button and change the button
images, red in in the area and blue outsides.

- Select Activity ACTION_MOVE


- Check if the move coordinates are in the area of the top most button, if yes
- Load the corresponding images for the four buttons.
- Check if the move coordinates are in the area of the second button from top, if yes
- Load the corresponding images for the four buttons.
- Check if the move coordinates are in the area of the third button from top, if yes
- Load the corresponding images for the four buttons.
- Check if the move coordinates are in the area of the lower button, if yes
- Load the corresponding images for the four buttons.
- Set the images for the three top buttons
14 GPS 188 Basic4Android Beginner's Guide

In this part we check in what button area the UP coordinates are and execute, or not, the
corresponding functions.

- Select Activity ACTION_UP


- Check if the move coordinates are in the area of the top most button, if yes
- Set the setup variables the given values, DispMapMarkers = True DispMapPolyline = True.
- Update the map.
- Check if the move coordinates are in the area of the second button from top, if yes
- Set DispMapMarkers = False DispMapPolyline = True.
- Update the map.
- Check if the move coordinates are in the area of the third button from top, if yes
- Set DispMapMarkers = False DispMapPolyline = False.
- Update the map.
- Check if the move coordinates are in the area of the lower button, if yes
- Start the GPSPaths activity.
- Depending on the setup variables we load the correct bitmap for the btnGPSPath button.
- Hide the tooltip.
- Hide the toolbox of the three upper buttons.
- Set the correct bitmap to btnGPSPath.
14 GPS 189 Basic4Android Beginner's Guide

14.3.4 GPS Calculate distance scales

The two routines below calculate the latitude X and longitude Y coordinates, in km,
from coordinate 0, 0 (equator and Greenwich meridian) to the given lat and lng coordinates.
 lat and lng are in degrees, we need to transform them to radians
with lng / 180 * cPI and lat / 180 * cPI.
 for Y (lat) we multiply the angle (in radians) by the earth radius (6371 km)
 for X (lng) we multiply the angle (in radians) by the earth radius (6371 km)
and multiply by CosD(lat).

The EarthRadius variable is defined in the Process_Globals routine in the GPSPaths module.
The EarthRadius value used, 6371 km, is a mean value. In reality, the EarthRadius varies with the
latitude but for our calculations the assumption of a mean radius is enough accurate.

It's 'simply' the Earthradius multiplied by the angle lat , but the angle is in degrees so we need
to tranform it into radians.

The calculation for the lng coordinate is similar to the lat calculation.
But, the radius of a circle of latitude depends on the latitude,
so we need to multiply the result by the cosine of lat CosD(lat).
We use CosD because the angle is in degrees.
14 GPS 190 Basic4Android Beginner's Guide

14.3.5 Drawing GPS position

The current GPS position is drawn on the map when:

the GPS is active,

a map is displayed.

'Show GPS on map' is selected in the setup.

The GoogleMap is drawn on the WebView MapViewer.

The position is drawn on the transparent panel pnlMap which is on top of the Activity and the
MapViewer WebView. The code below is in:

Where:
 Location1.Longitude, Location1.Latitude
are the current location coordinates in degrees.
 MapCenter.Longitude, MapCenter.Latitude
are the current map center coordinates in degrees
 MapScaleLng, MapScaleLat are the scales, degrees/pixel, of the current map.
 xc, yc are the coordinates of the current location in pixels.

Location1.Longitude and Location1.Latitude, the coordinates of the current position, are


given by the GPS.
In the equation.
xc = (Location1.Longitude - MapCenter.Longitude) / MapScaleLng + MapViewer.Width / 2

(Location1.Longitude - MapCenter.Longitude)
Is the x distance, in degrees, from the map center to the current location.
(Location1.Longitude - MapCenter.Longitude) / MapScaleLng
Is the x distance, in pixels, from the the map center to the current location.

(Location1.Longitude - MapCenter.Longitude) / MapScaleLng + MapViewer.Width / 2


Is the x distance, in pixels, from the left border to the current location.

The equation for yc is similar.


14 GPS 191 Basic4Android Beginner's Guide

Here we check if the current location reaches one of the maps border, and if true, we set the map
center coordinates to the current location coordinates and redraw the map.

Draws the location on the map.

Complementary calculation routines:

CalcMapScales: calculates the map pixel scales

Where:
 MapScaleLng = Longitude scale in degrees/pixel
 MapZoomLevel = Current map zoom level
 TileSize = Map tile size in pixels
 MapScaleLat = Latitude scale in degrees/pixel
 MapCenter.Latitude = Center lat coordinate of the current map in degrees.

360 is the earth circumference in degrees.


Power(2, MapZoomLevel) is the number of tiles for the given zoom level.
The default map tile size is 256 pixels definend in the Main module.

But this tile size must be changed according to the device's density, because on different devices
with almost the same physical dimensions, but different densities, the size of the map is the same.
That means that the tile size is proportional to the device density.
14 GPS 192 Basic4Android Beginner's Guide

Drawing of the GPS position on the map :

We
 define local variables
 draw a transparent rectangle to erase the previous position
 update the drawing
 set the variables for the drawing
 define the new surrounding rectangle
 draw a horizontal line
 draw a vertical line
 draw a circle
 update the drawing

If there are code sections you would like to be developped here, please post the qustions and
suggestions in the GPSExample thread on the users forum.
15 Basic language 193 Basic4Android Beginner's Guide

15 Basic language
In computer programming, BASIC (an acronym which stands for Beginner's All-purpose Symbolic
Instruction Code) is a family of high-level programming languages designed to be easy to use.
The original Dartmouth BASIC was designed in 1964 by John George Kemeny and Thomas
Eugene Kurtz at Dartmouth College in New Hampshire, USA to provide computer access to non-
science students. At the time, nearly all use of computers required writing custom software, which
was something only scientists and mathematicians tended to do. The language and its variants
became widespread on microcomputers in the late 1970s and 1980s.
BASIC remains popular to this day in a handful of highly modified dialects and new languages
influenced by BASIC such as Microsoft Visual Basic. (source Wikipedia).

15.1 Program flow

This is a summary of the more detailed explanations in Process and Activity life cycle.

The program goes through following routines when starting from top to down:

15.1.1 Process_Globals routine


Dedicated to the declaration of process global variables. Variables that are valid during the whole
life time of the process and accessible from everywhere in the program.
15 Basic language 194 Basic4Android Beginner's Guide

15.1.2 Globals routine


Dedicated to the declaration of activity global variables. Variables that are valid only during the life
time of the activity and accessible only insides the activity. As soon as the activity is paused, these
variables are no more available.

15.1.3 Activity_Create (FirstTime As Boolean) routine


Area to initialize activity variables.
If variables or objects must be initialized only once, the first time at the launch of the application,
you can use the FirstTime parameter to check it.

15.1.4 Activity_Resume routine


This routine is called every time an activity is launched or resumed, re-activated, Here you can set
any setup parameters for the new current activity.

15.1.5 Activity_Pause (UserClosed As Boolean) routine


When the activity is going to be paused, this routine Activity_Pause is called.
Here you need to save activity parameters you want to get back when the activity is resumed (re-
activated)

One of the most current reason why an activity is paused, is an orientation change.
In that case the current activity is 'paused', and re-activated with the new orientation and goes at
least through the Activity_Resume routine, but normally through Globals, Activity_Create and
Activity_Resume.

The variable UserClosed can be used to differentiate if the Activity has been paused by the
Operating System (ex: orientation change) or by the user (ex: back button click).
15 Basic language 195 Basic4Android Beginner's Guide

Program flow: Example: MyFirstProgram.

1. The program calls


Process_Globals.
In the example there is no
code.

2. Then the program calls


Globals.
Declares the variables.

3. Then the program calls


Activity_Create.
Loads the "Main" layout.
Calls the New subroutine.

4. The code in Sub New is


executed.
When reaching End Sub, the
program goes back to the
line following New.
In this case line 25.

5. Activity_Resume is called.
No code.

6. The program waits for an


event.

7. If the user clicks on the


Button btnAction
The Sub btnAction_Click is
called and the code inside
the Sub is executed.

8. The program waits for


another event.
15 Basic language 196 Basic4Android Beginner's Guide

15.2 Expressions

An expression in a programming language is a combination of explicit values, constants, variables,


operators, and functions that are interpreted according to the particular rules of precedence and of
association for a particular programming language, which computes and then produces (returns)
another value. This process, like for mathematical expressions, is called evaluation. The value can
be of various types, such as numerical, string, and logical (source Wikipedia).

For example, 2 + 3 is an arithmetic and programming expression which evaluates to 5. A variable is


an expression because it is a pointer to a value in memory, so y + 6 is an expression. An example of
a relational expression is 4 = 4 which evaluates to True (source Wikipedia).

15.2.1 Mathematical expressions

Operator Example Precedence level Operation


+ x + y 3 Addition
- x - y 3 Subtraction
* x * y 2 Multiplication
/ x / y 2 Division
Mod x Mod y 2 Modulo
y
Power Power(x,y) x 1 Power of

Precedence level: In an expression, operations with level 1 are evaluated before operations with
level 2, which are evaluated before operations with level 3.

Examples:

4 + 5 * 3 + 2 = 21 > 4 + 15 + 2

(4 + 5) * (3 + 2) = 45 > 9*5

(4 + 5)2 * (3 + 2) = 405 > 92 * 5 > 81 * 5


Power(4+5,2)*(3+2)

11 Mod 4 = 3 > Mod is the remainder of 10 / 4

233 Power(23,3) > 23 at the power of 3

- 22 = - 4
(-2)2 = 4
15 Basic language 197 Basic4Android Beginner's Guide

15.2.2 Relational expressions

In computer science in relational expressions an operator tests some kind of relation between two
entities. These include numerical equality (e.g., 5 = 5) and inequalities (e.g., 4 >= 3).
In B4A these operators return True or False, depending on whether the conditional relationship
between the two operands holds or not (source Wikipedia).

Operator Example Used to test


= x=y the equivalence of two values
<> x <> y the negated equivalence of two values
> x>y if the value of the left expression is greater than that of the right
< x<y if the value of the left expression is less than that of the right
>= x >= y if the value of the left expression is greater than or equal to that of the right
<= x <= y if the value of the left expression is less than or equal to that of the right

15.2.3 Boolean expressions

In computer science, a Boolean expression is an expression that produces a Boolean value when
evaluated, i.e. one of True or False. A Boolean expression may be composed of a combination of
the Boolean constants True or False, Boolean-typed variables, Boolean-valued operators, and
Boolean-valued functions (source Wikipedia).

Boolean operators are used in conditional statements such as IF-Then and Select-Case.

Operator Comment
Or Boolean Or Z = X Or Y Z = True if X or Y is equal to True or both are True
And Boolean And Z = X And Y Z = True if X and Y are both equal to True
Not ( ) Boolean Not X = True Y = Not(X) > Y = False

Or And
X Y Z Z
False False False False
True False True False
False True True False
True True True True

15.3 Conditional statements

Different conditional statements are available in Basic.


15 Basic language 198 Basic4Android Beginner's Guide

15.3.1 If – Then – End If

The If-Then-Else structure allows to operate conditional tests and execute different code sections
according to the test result.
General case:

The If-Then-Else structure works as follows:


1. When reaching the line with the If keyword, test1 is executed.
2. If the test result is True, then code1 is executed until the line with the Else If keyword.
And jumps to the line following the End If keyword and continues.
3. If the result is False, then test2 is executed.
4. If the test result is True, then code2 is executed until the line with the Else keyword.
And jumps to the line following the End If keyword and continues.
5. If the result is False, then code3 is executed and continues at the line following the End
If keyword.

The tests can be any kind of conditional test with two possibilities True or False.
Some examples:

The simplest If-Then structure.

The same but in one line.

The simplest If-Then-Else structure.

The same but in one line.

Personally, I prefer the structure on several lines, better readable.


Old habit from HP Basic some decades ago, this Basic accepted only one instruction per line.

Note. Difference between:


B4A VB
Else If ElseIf

In B4A there is a blank character between Else and If.


15 Basic language 199 Basic4Android Beginner's Guide

15.3.2 Select – Case

The Select - Case structure allows to compare a TestExpression to other Expressions an


execute different code sections according to the matches between the TestExpression and
Expressions.

General case:

TestExpression is the expression to test.

ExpressionList1 is a list of expressions to compare


to TestExpression
ExpressionList2 is another list of expressions to compare
to TestExpression

The Select - Case structure works as follows:

1. The TestExpression is evaluated.


2. If one element in the ExpressionList1 matches TestExpression then executes
code1 and continues at the line following the End Select keyword.
3. If one element in the ExpressionList2 matches TestExpression then executes
code2 and continues at the line following the End Select keyword.
4. For no expression matches TestExpression executes code3
and continues at the line following the End Select keyword.

TestExpression can be any expression or value.


ExpressionList1 is a list of any expressions or values.

Examples:

The Value variable is a numeric value.

The TestExpression is the sum of a + b

The TestExpression is a character at


15 Basic language 200 Basic4Android Beginner's Guide

Note. Differences between:


B4A VB
Select Select Case
Case 1,2,3,4,8,9,10 Case 1 To 4 , 8 To 9

In VB the keyword Case is added after the Select keyword.


VB accepts Case 1 To 4 , this is not implemented in B4A.
15 Basic language 201 Basic4Android Beginner's Guide

15.4 Loop structures

Different loop structures are available in Basic.

15.4.1 For – Next

The For–Next loop allows to repeat a certain number of times the same code.
Example:

i incremental variable
n1 initial value
n2 final value
n3 step

The For–Next loop works like follows:


1. At the beginning, the incremental variable i is equal to the initial value n1.
i = n1
2. The specific code between the For and Next keywords is executed.
3. When reaching Next, the incremental variable i is incremented by the step value n3.
i = i + n3.
4. The program jumps back to For, compares if the incremental variable i is lower or equal to
the final value n2.
test if i <= n2
5. If Yes, the program continues at step 2, the line following the For keyword.
6. If No, the program continues at the line following the Next keyword.

If the step value is equal to '+1' the step keyword is not needed.

is the same as

The step variable can be negative.

It is possible to exit a For – Next loop with the Exit keyword.

In this example, if the variable a equals 0

Then exit the loop.


15 Basic language 202 Basic4Android Beginner's Guide

Note: Differences between


B4A VB
Next Next i
Exit Exit For

In VB the increment character is added after the Next Keyword.


In VB the loop type is specified after the Exit keyword.

15.4.2 Do - Loop

Several configurations do exist:

test is any expression


Executes the code while test is True

test is any expression


Executes the code until test is True

The Do While -Loop loop works like follows:


1. At the beginning, test is evaluated.
2. If True, then executes code
3. If False continues at the line following the Loop keyword.

The Do Until -Loop loop works like follows:


1. At the beginning, test is evaluated.
2. If False, then executes code
3. If True continues at the line following the Loop keyword.

It is possible to exit a Do-Loop structure with the Exit keyword.

If a = 0 then exit the loop

Examples:

Note: Difference between:


B4A VB
Exit Exit Loop

In VB the loop type is specified after the Exit keyword.

VB accepts also following loops, which are not supported inB4A.


15 Basic language 203 Basic4Android Beginner's Guide

15.5 Subs

A Subroutine (“Sub”) is a piece of code. It can be any length, and it has a distinctive name
and a defined scope (in the means of variables scope discussed earlier). A Subroutine is
called “Sub” in Basci4Android code, and is equivalent to procedures, functions, methods and
subs in other programming languages. The lines of code inside a Sub are executed from
first to last, as described in the program flow chapter.
It is not recommended to have too long Subs, they get less readable.

15.5.1 Declaring

A Sub is declared in the following way:

It starts with the keyword Sub, followed by the Sub’s name, followed by a parameter list, followed
by the return type and ends with the keywords End Sub.
Subs are always declared at the top level of the module – that is, you cannot nest two Subs
one inside the other.

15.5.2 Calling a Sub

When you want the lines of code in a Sub to execute, you simply write the Sub’s name.

For example:

Interest Value returned by the Sub.


CalcInterest Sub name.
1235 Capital value transmitted to the Sub.
5.25 Rate value transmitted to the Sub.

15.5.3 Naming

Basically, you can name a Sub any name that’s legal for a variable. It is recommended to
name the Sub with a significant name, like CalcInterest in the example, so you can tell what it
does from reading the code.
There is no limit on the number of Subs you can add to your program, but it is not
allowed to have two Subs with the same name in the same module.
15 Basic language 204 Basic4Android Beginner's Guide

15.5.4 Parameters

Parameters can be transmitted to the Sub, this list follows the sub name between brackets.
The parameter types can be declared directly in the list.

In B4A, the parameters are transmitted by value and not by reference.

15.5.5 Returned value

A sub can return a value, this can be any object.


Returning a value is done with the Return keyword.
The type of the return value is added after the parameter list.
15 Basic language 205 Basic4Android Beginner's Guide

15.6 Events

In Object-oriented programming we have objects which can react on different user actions called
events.
The number and type of events an object can raise depends on the type of the object.
User interface objects are called 'Views' in Android.

Summary of the events for different views:

Events

CheckedChange
ItemLongClick

ValueChanged
FocusChanged

TextChanged

PageFinished
EnterPressed

TabChanged
LongClick

ItemClick
KeyPress
Touch

Down
Click

Up

Views
Activity
Button
CheckBox
EditText
ImageView
Label
ListView
Panel
RadioButton
SeekBar
Spinner
TabHost
ToggleButton
WebView
15 Basic language 206 Basic4Android Beginner's Guide

The most common events are:

 Click Event raised when the user clicks on the view.


Example:

 LongClick Event raised when the user clicks on the view and holds down a short
moment.
Example:

 Touch (Action As Int, X As Float, Y As Float)


Event raised when the user touches the screen.

Three different actions are handled:


- Activity.Action_DOWN, the user touches the screen.
- Activity.Action_MOVE, the user moves the finger without leaving the screen.
- Activity.Action_UP, the user leaves the screen.

The X an Y coordinates of the finger position are given.

Example:

 CheckChanged (Checked As Boolean)


Event raised when the user clicks on a CheckBox or a RadioButton
Checked is equal to True if the view is checked or False if not checked.

Example:
15 Basic language 207 Basic4Android Beginner's Guide

 KeyPress (KeyCode As Int) As Boolean


Event raised when the user presses a physical or virtual key.
KeyCode is the code of the pressed key, you can get them with the KeyCodes keyword.

The event can return either:


- True, the event is 'consumed' and no further action is taken.
- False, the event is not consumed and transmitted to the system for further actions.

Example:
15 Basic language 208 Basic4Android Beginner's Guide

15.7 Libraries

Libraries add more objects and functionalities to B4A.


Some of these libraries are shipped with B4A and are part of the standard development system.
Other, often developed by users like Andrew Graham (agraham), can be downloaded (by registered
users only) to add supplementary functionalities to the B4A development environment.

When you need a library, you have to:


- Check in the Lib Tab, if you already have the library.
- For additional libraries, check if it's the latest version.
- If yes, then check the library in the list to select it.

- If no, download the library, unzip it and copy the


<LibraryName>.jar and <LibraryName>.xml files to the additional libraries folder.
- Restart the IDE and check the library in the Lib Tab list to select it.

15.7.1 Standard libraries

The standard B4A libraries are saved in the Libraries folder in the B4A program folder.
Normally in: C:\Program Files\Anywhere Software\Basic4android\Libraries

15.7.2 Additional libraries folder

For the additional libraries it is useful to setup a special folder to save them somewhere else.
For example: D:\Basic4Android\AddLibraries

When you install a new version of B4A, all standard libraries are automatically updated, but the
additional libraries are not included. The advantage of the special folder is that you don't need to
care about them because this folder is not affected when you install the new version of B4A.
The additional libraries are not systematically updated with new version of B4A.

When the IDE starts, it looks first for the available libraries in the Libraries folder of B4A and then
in the folder for the additional libraries.
15 Basic language 209 Basic4Android Beginner's Guide

If you setup a special additional libraries folder you must specify it in the IDE.

In the menu Tools / Configure Paths:

Enter the folder name and click on .

15.7.3 Error message "Are you missing a library reference?"

If you get this message, means that you forgot to check the specified library in the Lib Tab list !
15 Basic language 210 Basic4Android Beginner's Guide

15.8 String manipulation

Basic4Android allows string manipulations like other basic languages but with some differences.

These manipulations can be done directly on a string.


Example:

Result: 123;234;45;23

The different functions are:


 CharAt(Index) Returns the character at the given index.
 CompareTo(Other) Lexicographically compares the string with the Other string.
 Contains(SearchFor) Tests whether the string contains the given SearchFor string.
 EndsWith(Suffix) Returns True if the string ends with the given Suffix substring.
 EqualsIgnoreCase(Other) Returns True if both strings are equal ignoring their case.
 GetBytes(Charset) Encodes the Charset string into a new array of bytes.
 IndexOf(SearchFor) Returns the index of the first occurrence of SearchFor in the
string.
 IndexOf2(SearchFor, Index) Returns the index of the first occurrence of SearchFor
in the string. Starts searching from the given index.
 LastIndexOf(SearchFor) Returns the index of the first occurrence of SearchFor in the
string. Starts searching from the end of the string.
 Legnth Returns the length, number of characters, of the string.
 Replace(Target, Replacement) Returns a new string resulting from the replacement of
all the occurrences of Target with Replacement.
 StartsWith(Prefix) Returns True if this string starts with the given Prefix.
 Substring(BeginIndex) Returns a new string which is a substring of the original string.
The new string will include the character at BeginIndex and will extend to the end of the
string.
 Substring2(BeginIndex,EndIndex) Returns a new string which is a substring of the
original string. The new string will include the character at BeginIndex and will extend to
the character at EndIndex, not including the last character.
 ToLowerCase Returns a new string which is the result of lower casing this string.
 ToUpperCase Returns a new string which is the result of upper casing this string.
 Trim Returns a copy of the original string without any leading or trailing
white spaces.

Number formating, display numbers as strings with different formats, there are two keywords:
 NumberFormat(Number As Double, MinimumIntegers As Int, MaximumFractions As Int)
NumberFormat(12345.6789, 0, 2) = 12,345.68
NumberFormat(1, 3 ,0) = 001
NumberFormat(Value, 3 ,0) variables can be used.
NumberFormat(Value + 10, 3 ,0) arithmetic operations can be used.
NumberFormat((lblscore.Text + 10), 0, 0) if one variable is a string add parentthesises.

 NumberFormat2(Number As Double, MinimumIntegers As Int, MaximumFractions As


Int, MinimumFractions As Int, GroupingUsed As Boolean)
NumberFormat2(12345.67, 0, 3, 3, True) = 12,345.670
15 Basic language 211 Basic4Android Beginner's Guide

15.9 Timers

A Timer object generates ticks events at specified intervals. Using a timer is a good alternative to a
long loop, as it allows the UI thread to handle other events and messages.
Note that the timer events will not fire while the UI thread is busy running other code (unless you
call DoEvents keyword).
Timer events will not fire when the activity is paused, or if a blocking dialog (like Msgbox) is
visible.
It is also important to disable the timer when the activity is pausing and then enable it when it
resumes. This will save CPU and battery.

A timer has:
 Three parameters.
o Initialize Initializes the timer with two parameters, the EventName and the
interval.
Timer1.Initialize(EventName As String, Interval As Long)
Ex: Timer1.Initialize("Timer1", 1000)

o Interval Sets the timer interval in milli-seconds.


Timer1. Interval = Inerval
Ex: Timer1.Interval = 1000, 1 second

o Enabled Enables or disables the timer. It is False by default.


Ex: Timer1.Enabled = True

 One Event
o Tick The Tick routine is called every time interval.
Ex: Sub Timer1_Tick

The Timer must be declared in a Process_Global routine.

But it must be initialized in the Activity_Create routine in the module where the timer tick
event routine is used.

And the Timer Tick event routine.


This routine will be called every second (1000 milli-seconds) by the operating system.

You find an example in the RotatingNeedle example program.


15 Basic language 212 Basic4Android Beginner's Guide

15.10 Files

Many applications require access to a persistent storage. The two most common storage types are
files and databases.

15.10.1 File object

The predefined object File has a number of functions for working with files.

Files locations - There are several important locations where you can read or write files.

File.DirAssets
The assets folder includes the files that were added with the file manager in the IDE.
These files are read-only.
You can not create new files in this folder (which is actually located inside the apk file).
If you have a database file in the Dir.Assets folder you need to copy it to another folder before you
can use it.

File.DirInternal / File.DirInternalCache
These two folders are stored in the main memory and are private to your application. Other
applications cannot access these files.
The cache folder may get deleted by the OS if it needs more space.

File.DirRootExternal
The storage card root folder.

File.DirDefaultExternal
The default folder for your application in the SD card.
The folder is: <storage card>/Android/data/<package>/files/
It will be created if required.

Note that calling any of the two above properties will add the EXTERNAL_STORAGE permission
to your application.

Tip: You can check if there is a storage card and whether it is available with
File.ExternalReadable and File.ExternalWritable.

To check if a file does already exist use:


File.Exists ( Dir As String, FileName As String)
Returns True if the file does exist and False if not.

The File object includes several methods for writing to files and reading from files.

To be able to write to a file or to read from a file, this one must be opened.
15 Basic language 213 Basic4Android Beginner's Guide

File.OpenOutput (Dir As String, FileName As String, Append As Boolean)


- Opens the given file for output, the Append parameter tells whether the text will be added at the
end of the existing file or not. If the file doesn't exist it will be created.

File.OpenInput (Dir As String, FileName As String)


- Opens the file for reading.

File.WriteString (Dir As String, FileName As String, Text As String)


- Writes the given text to a new file.

File.ReadString (Dir As String, FileName As String) As String


- Reads a file and returns it content as a string.

File.WriteList (Dir As String, FileName As String, List As List)


- Writes all values stored in a list to a file. All values are converted to string type if required. Each
value will be stored in its own line.
Note that if a value contains the new line character it will saved over more than one line and when
you read it, it will be read as multiple items.

File.ReadList (Dir As String, FileName As String) As List


- Reads a file and stores each line as an item in a list.

File.WriteMap (Dir As String, FileName As String, Map As Map)


- Takes a map object which holds pairs of key and value elements and stores it in a text file. The file
format is known as Java Properties file: .properties - Wikipedia, the free encyclopedia
The file format is not too important unless the file is supposed to be edited manually. This format
makes it easy to edit it manually.
One common usage of File.WriteMap is to save a map of "settings" to a file.

File.ReadMap (Dir As String, FileName As String) As Map


- Reads a properties file and returns its key/value pairs as a Map object. Note that the order of
entries returned might be different than the original order.

Some other useful functions:

File.Copy (DirSource As String, FileSource As String, DirTarget As String, FileTarget As String)


- Copies the source file from the source directory to the target file in the target directory.
Note that it is not possible to copy files to the Assets folder.

File.Delete (Dir As String, FileName As String)


- Deletes the given file from the given directory.

File.ListFiles (Dir As String) As List


- Lists the files and subdirectories in the diven directory.
Example:
Dim List1 As List
List1 = File.ListFiles(File.DirRootExternal)
List1 can be 'dimed' in Sub Globals

File.Size (Dir As String, FileName As String)


- Returns the size in bytes of the specified file.
This method does not support files in the assets folder.
15 Basic language 214 Basic4Android Beginner's Guide

15.10.2 TextWriter

There are two other useful functions for text files: TextWriter and TextReader:

TextWriter.Initialize (OutputStream As OutputStream)


- Initializes a TextWriter object as an output stream.

Example:
Dim Writer As TextWriter
Writer.Initialize(File.OpenOutput(File.DirRootExternal, "Test.txt" , False))

Writer could be 'dimed' in Sub Globals.

TextWriter.Initialize2 (OutputStream As OutputStream , Encoding As String)


- Initializes a TextWriter object as as output stream.
- Encoding indicates the CodePage (also called CharacterSet), the text encoding (see next chapter).

Example:
Dim Writer As TextWriter
Writer.Initialize2(File.OpenOutput(File.DirRootExternal,"Test.txt" ,False)," ISO-8859-1")

Writer could be 'dimed' in Sub Globals.

TextWriter.Write (Text As String)


- Writes the given Text to the stream.

TextWriter.WriteLine (Text As String)


- Writes the given Text to the stream followed by a new line character LF Chr(10).

TextWriter.WriteList (List As List)


- Writes each item in the list as a single line.
Note that a value containing CRLF will be saved as two lines (which will return two item when read
with ReadList).
All values will be converted to strings.

TextWriter.Close
- Closes the stream.

Example:
15 Basic language 215 Basic4Android Beginner's Guide

15.10.3 TextReader

There are two other useful functions for text files: TextWriter and TextReader:

TextReader.Initialize (InputStream As InputStream)


- Initializes a TextReader as an input stream.

Example:
Dim Reader TextReader
Reader.Initialize(File.InputOutput(File.DirRootExternal, "Test.txt"))

Reader could be 'dimed' in Sub Globals.

TextReader.Initialize2 (InputStream As InputStream, Encoding As String)


- Initializes a TextReader as an input stream.
- Encoding indicates the CodePage (also called CharacterSet), the text encoding.

Example:
Dim Reader TextReader
Reader.Initialize(File.OpenInput(File.DirRootExternal, "Test.txt")," ISO-8859-1")

Reader could be 'dimed' in Sub Globals.

TextReader.ReadAll As String
- Reads all of the remaining text and closes the stream.

Example:
txt = Reader.ReadAll

TextReader.ReadLine As String
- Reads the next line from the stream.
The new line characters are not returned.
Returns Null if there are no more characters to read.

Example:

TextReader.ReadList As List
- Reads the remaining text and returns a List object filled with the lines.
Closes the stream when done.

Example:
List1 = Reader.ReadList
15 Basic language 216 Basic4Android Beginner's Guide

15.10.4 Text encoding

Text encoding or character encoding consists of a code that pairs each character from a given
repertoire with something else. Other terms like character set (charset), and sometimes character
map or code page are used almost interchangeably (source Wikipedia).

The default character set in Android is Unicode UTF-8.

In Windows the most common character sets are ANSII and ANSIS.
 ASCII includes definitions for 128 characters, 33 are non-printing control characters (now
mostly obsolete) that affect how text and space is processed.
 ANSI, Windows-1252 or CP-1252 is a character encoding of the Latin alphabet, used by
default in the legacy components of Microsoft Windows in English and some other Western
languages with 256 definitions (one byte). The first 128 characters are the same as in the
ASCII encoding.

Many files generated by Windows programs are encoded with the ANSI characterset in western
countries.
For example: Excel csv files, Notepad files by default, but files can be saved, with Notepad, with
UTF-8 encoding.

Android can use following character sets:


 UTF-8 default character set
 UTF -16
 UTF - 16 BE
 UTF - LE
 US-ASCII ASCII character set
 ISO-8859-1 almost equivalent to the ANSI character set

To read Windows file encoded with ANSI you should use the ISO-8859-1 character set.
If you need to write files for use with Windows you should also use the ISO-8859-1 character set.

Another difference between Windows and Android is the end of line character:
 Android, only the LF (Line Feed) character Chr(10) is added at the end of a line.
 Windows, two characters CR (Carriage Return Chr(13)) and LF Chr(10) are added at the
end of a line. If you need to write files for Windows you must add CR yourself.

The symbol for the end of line is :


 Basic4Android CRLF Chr(10)
 Basic4PPC CRLF Chr(10) & Chr(13)

To read or write files with a different encoding you must use the TextReader or TextWriter objects
with the Initialize2 methods. Even for reading csv files.
15 Basic language 217 Basic4Android Beginner's Guide

Tip for reading Excel csv files:


You can either:
 On the desktop , load the csv file in a text editor like NotePad or Notepad++
 Save the file with UTF-8 encoding

Or
 Read the whole file with TextReader.Initialize2 and "ISO-8859-1" encoding.
 Save it back with TextWriter.Initialize with the standard Android encoding.
 Read the file with LoadCSV or LoadCSV2 from the StringUtils library.
16 Graphics / Drawing 218 Basic4Android Beginner's Guide

16 Graphics / Drawing

16.1 Overview

To draw graphics we need to use a Canvas object.

Explanations from the help file.


A Canvas is an object that draws on other views or (mutable) bitmaps.
When the canvas is initialized and set to draw on a view, a new mutable bitmap is created for that
view background, the current view's background is copied to the new bitmap and the canvas is set
to draw on the new bitmap.
The canvas drawings are not immediately updated on the screen. You should call the target view
Invalidate method to make it refresh the view.
This is useful as it allows you to make several drawings and only then refresh the display.
The canvas can be temporary limited to a specific region (and thus only affect this region). This is
done by calling ClipPath. Removing the clipping is done by calling RemoveClip.
You can get the bitmap that the canvas draws on with the Bitmap property.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

It is possible to draw onto following views:


 Activity
 ImageView
 Panel
 Bitmap (mutable)

In the following functions you will find a number of common parameters.


 Bitmap1 as Bitmap an Android bitmap
 x, y. x1, y1, x2, y2 As Float are coordinates, Float variables.
 Color as Int are color variables. Int variables
 SrcRect, DestRact, Rect1 As Rect are rectangles, Rect objects
 Filled As Boolean flag if the surface is filled (True) or not (False)

The most common drawing functions are:


 DrawBitmap (Bitmap1 As Bitmap, SrcRect As Rect, DestRect As Rect)
Draws the given bitmap or only a part of it..
SrcRect = source rectangle, can be only a part of the original bitmap.
DestRect = destination rectangle, can be any size.
Do draw with the same size both rectangles must have same width and same height.
If DestRect is different than SrcRect the destination drawing is stretched or shrinked
depending on the size ratios between the two rectangles.

 Draw BitmapRotated (Bitmap1 As Bitmap, SrcRect As Rect, DestRect As Rect, Degrees


As Float)
Same function as DrawBitmap, but with a rotation of the given Degrees angle around the
centre of the bitmap.

 DrawCircle (x As Float, y As Float, Radius As Float, Color as Int, Filled As Boolean,


StrokeWidth As Float)
Draws a circle.
x an y are the centre coordinates of the circle and Radius the circles radius.
16 Graphics / Drawing 219 Basic4Android Beginner's Guide

 DrawColor (Color As Int)


Fills the whole view with the given color.
The color can be Colors.Transparent making the whole view transparent.

 DrawLine (x1 As Float, y1 As Float, x2 As Float, y2 As Float, Color as Int, StrokeWidth


As Float)
Draws a straight line.

 DrawRect (Rect1 As Rect, Color As Int, Filled As Boolean, StrokeWidth as Float)


Draws a rectangle with given size, color, filled or not and line width.

 DrawRectRotated (Rect1 As Rect, Color As Int, Filled As Boolean, StrokeWidth As Float,


Degrees As Float)
Same as DrawRect but rotated by the given angle

 DrawText (Text As String, x As Float, y As Float, Typeface1 As TypeFace, TestSize As


Float, Color As Int Align1 As Align)

 DrawTextRotated (Text As String, x As Float, y As Float, Typeface1 As TypeFace,


TestSize As Float, Color As Int Align1 As Align, Degrees As Float)
16 Graphics / Drawing 220 Basic4Android Beginner's Guide

16.2 Drawing test programs

16.2.1 Drawing rotating bitmaps / RotatingNeedle

In the first test program we will demonstrate the DrawBitmapRotated function.


The program has two modes:
 A rotating needle with a static compass
 A rotating compass with a static needle

We have in the layout:

 3 buttons

o
starts rotating

o
step by step moving

o
we can let turn either the needle
or the compass.

 2 bitmap files
o compass.png
o needle.png

In the DrawBitmapRotated function the bitmap rotates around the bitmaps centre.

If we had a needle image like this one, we would need to do some calculations to make sure that
it turns around the needle centre.

To avoid these calculations, the needle bitmap looks like this one. We added the lower part so
that the needle centre is at the bitmap's centre.

The blue pixels are, in reality, transparent pixels.


16 Graphics / Drawing 221 Basic4Android Beginner's Guide

Let us have a look at the code.

Here we define three global variables with their values.


 AngleStep step in degrees for the angle variations from one step to the next.
 Angle current angle of the needle
 Mode program mode
True = needle turns
False = compass turns

Then we define the different objects used by the program.


 The three buttons from the layout file.
 Two Canvas views, one for the compass and one for the needle.
 Two Bitmaps, one for the compass and one for the needle.
 Two ImageViews, one for the compass and one for the needle.
 Three rectangles, one for the compass, two for the needle source and destination.
 One Timer, it is used to move dynamically the needle or the compass.

In the Activity_Create routine we:

 Define two variables used for calculations


 Load the layout file to the Activity

 Initialize the compass bitmap


 Initialize the needle bitmap
16 Graphics / Drawing 222 Basic4Android Beginner's Guide

 Initialize the compass ImageView.


 Set the compass bitmap to the compass ImageView bitmap.
 Initialize the needle ImageView.
 Set the needle ImageView color to transparent.

 Calculate the Left and Top coordinates of the compass ImageView.


 Add the compass ImageView to the Activity.
 Add the needle ImageView to the Activity
with the same dimensions as the compass ImageView.
 Initialize the compass Canvas and connect it to the compass ImageView.
 Initialize the compass rectangle.

 Initialize the needle Canvas and connect it to the needle ImageView.


 Calculate the Left and Top coordinates of the needle ImageView.
 Initialize the needle source and destination rectangles.

 Initialise the timer, set the Interval to 200 ms.


 Call the Timer1_Tick routine to draw the needle
16 Graphics / Drawing 223 Basic4Android Beginner's Guide

In the Timer1_Tick routine we:

 Define a local variable representing the current Angle


 Calculate the new Angle using the Mod operator
 If Mode = True, rotating needle mode we:
o Draw a rotated transparent rectangle to erase the current needle.
o Draw the needle with the new angle.
o Invalidate the needle ImageView to update it.
 If Mode = False, rotating compass mode we:
o Draw the compass with the new angle, in our case the source and destination
rectangle are the same.
o Invalidate the compass ImageView to update it.

In the btnStep_Click routine we:

 Call the Timer1_Tick routine to draw a new step.


16 Graphics / Drawing 224 Basic4Android Beginner's Guide

In the btnGoStop_Click routine we:

 If Timer1 = True, the timer is running.


o We set the Timer1.Enabled parameter to False to stop it.
o Set the btnGoStop button text to "Go".
o Set the btnStep button to visible.
 If Timer1 = False, the timer is stopped
o We set the Timer1.Enabled parameter to True to let it run.
o Set the btnGoStop button text to "Stop".
o Hide the btnStep button.

In the btnMode_Click routine we:

 We change the Mode variable from True to False or from False to True with the Not
keyword.
 If Mode = True, rotating needle, we:
o Set the button text to "Needle turns".
o Draw a transparent rectangle to erase the current needle.
o Draw the needle at the new position.
o Draw the default compass.
 If Mode = False, rotating compass, we:
o Set the button text to "Compass turns".
o Erase the current needle
o Draw the new needle.
16 Graphics / Drawing 225 Basic4Android Beginner's Guide

16.2.2 Simple draw functions

In the second drawing program, SimpleDrawFunctions, we use the other common drawing
functions.

The program has no other utility than show what can be done with drawings.

The program has three Panels which we use as layers and three ToggleButtons buttons allowing us
to show or hide each layer.
Layer(0) has a grey background and the two other layers have a transparent background.

You can play with the buttons to show the different combinations of visible and hidden layers.
16 Graphics / Drawing 226 Basic4Android Beginner's Guide

In this screenshot we just see the background image of


the activity.

We use the ToggleButtons to either show or hide the


different layers.

Here we show layout(0).

The panel has a dark gray background with:


 a blue circle.
 a transparent circle, the activity's background is
inside this circle.
 a blue, semi-transparent rectangle
 a transparent rectangle, the activity's background
is inside this circle.

Touching the screen and moving the finger moves the


blue and transparent circles on layer(0).
16 Graphics / Drawing 227 Basic4Android Beginner's Guide

Here we show layout(1).

The panel has a transparent background with:


 a green circle.
 a small copy of the activity's background image.
 a green, rotated semi-transparent rectangle.

We see that the rectangle covers the activity's


background because layer 1 is in front of layer 0.

Here we show layout(2).

The panel has a transparent background with:


 4 lines on top.
 3 horizontal texts with the three different
alignments.
 3 rotated texts with the three different alignments.
 a point for each text showing the position of the
reference point.

You can play with the buttons to show the different combinations of visible and hidden layers.
16 Graphics / Drawing 228 Basic4Android Beginner's Guide

Touching the screen with the finger and moving it,


moves the blue and transparent circles.

On each move, the backgound image of the activity


appears.
16 Graphics / Drawing 229 Basic4Android Beginner's Guide

Analysis of the code:

There is no layout file, all views are added by code.

In the Sub Globals routine we declare the different views and variables:

We have:
 3 Panels
 3 Canvases
 3 ToggleButtons
 1 Rect, rectangle used to draw rectangles
 1 Bitmap, holding the activity's background image
 1 BitmapDrawable, holds the activity's background
 different variables used for the drawing.

Note that we use arrays of views for the three panels, canvases and togglebuttons.
Dim pnlLayer(3) As Panel instead of Dim pnlLayer0, pnlLayer1, pnlLayer2 As Panel.

In the Sub Activity_Create routine we initialize the different views and add them to the activity:

We:
 initialize the views only if FirstTime = True.
 load the Rose2.jpg image file into the bitmap.
 initialize the background image of the activity.
 set the activity's background image

 initialize some variables.


16 Graphics / Drawing 230 Basic4Android Beginner's Guide

In a loop we:
 initialize the layer Panels.
we define an individual EventName for each of the three Panels
we use only an event on layout(0).
 add the panels to the activity.
 initialize the layer Canvases.
 set the Panels Tag parameter to the index.

 initialize the layer ToggleButtons.


we define a single EventName for all three ToggleButtons.
we manage the showing and hiding of the Panels in one single event routine.
 calculate the left coordinate for each ToggleButton.
 set the texts for the two states.
 set the Checked parameter to True.
 set the Tag parameter to the index.

In the Sub Activity_Resume routine we call the Drawing routine.


16 Graphics / Drawing 231 Basic4Android Beginner's Guide

In the Sub Drawing routine we:

 draw the layout(0) background dark gray.


 draw the layout(1) and layout(2) background transparent.

 draw four lines onto layer(2)


cvsLayer(2).DrawLine(x1, y1, x2, y2, Colors.Red, 0)
the last StrokeWidth parameter is '0', this means hairline mode, the width is one pixel.
cvsLayer(2).DrawLine(x1, y1, x2, y2, Colors.Green, 0.99dip)
here we use 0.99dip instead of 1dip because in some cases no line or only parts of it are
drawn. This is a known bug in Android with a StrokeWidth of '1'.

 draw a green circle line on layer(1).


 draw a filled blue circle on layer(0).
 draw a filled transparent circle on layer(0).
16 Graphics / Drawing 232 Basic4Android Beginner's Guide

 define the coordinates of a rectangle.


 draw a red rectangle on layer(1).
 define the coordinates of a rectangle.
 draw a semi-transparent blue rectangle on layer(0).
 draw a semi-transparent green rotated rectangle on layer(1).
 define the coordinates of a rectangle.
 draw a transparent rectangle on layer(0).
 define the coordinates of a rectangle.
 draw a red rectangle on layer(1).

 define the coordinates of a rectangle.


 draw the activity's background image in a smaller rectangle on layer(1)

 draw the text "Rose" with the three different possible alignments.
 draw the reference point for each text.

 same as above but rotated texts.


16 Graphics / Drawing 233 Basic4Android Beginner's Guide

Looking closer on the displayed texts we see the reference point for each text.

These are the x1 and y1 coordinates used to display the texts.

LEFT alignment.

CENTER alignment.

RIGHT alignment.

In the Sub btnLayer_Checked routine we:

 dim a local Button to get the view that raised the event.
 set Send to the Sender view
 change the Visible parameter from True to False or from False to True.

In the Sub pnlLayer0_Checked routine we:

 draw a dark gray circle to erase the previous blue and transparent circle.
 set xc and yc to the new coordinates of the circle centres.
 draw a blue and transparent circle on layer(1).
 invalidate pnlLayout(1) to force the update of the drawing.
17 Widgets 234 Basic4Android Beginner's Guide

17 Widgets, home screen widgets


This chapter is a copy of Erels' two tutorials in the users forum.
Android home screen widgets tutorial - part I
Android home screen widgets tutorial - part II

17.1 Widgets Part I

Basic4android v1.6 adds support for home screen widgets. This tutorial will explain how to
implement your own home screen widgets (also named App Widgets).

It is important to understand that the widgets are created and managed in another process, different
than the process that your application is running in. The home screen application is hosting your
widgets.
This means that it is not possible to directly access the widgets views. Instead we are using a special
object named RemoteViews which gives us indirect access to the widget views.

Widgets do not support all views types. The following views are supported:
 Button (default drawable)
 Label (ColorDrawable or GradientDrawable)
 Panel (ColorDrawable or GradientDrawable)
 ImageView
 ProgressBar (both modes)

All views support the Click event and no other event.

The widget layout and configuration must be defined with XML files. During compilation
Basic4android reads the layout file created with the designer and generates the required XML files.

Each widget is tied to a Service module. Through this module the widget is created and updated.

Creating a widget - step by step guide

 Add a Service module. Note that the service module handling the widget is a standard
service.
 Design the widget layout with the designer. First add a Panel and then add the other views to
this Panel.
The widget layout will be made from this panel.
 Add code similar to the following code the service module:
17 Widgets 235 Basic4Android Beginner's Guide

 Compile and run your application. Go to the home screen, long press on the screen and you
will see your widget listed on the widgets list.

ConfigureHomeWidget is a special keyword. At runtime it creates the RemoteViews object from


the layout and set the events. At compile time the compiler generates the required files based on the
arguments of this keyword.
The four parameters are: layout file, event name, update interval and the widget name.
Event name sets the subs that will handle the RequestUpdate and Disabled events.
The widget can be configured to update itself automatically. The interval, measured in minutes,
defines how often will the widget request to update itself. Set to 0 to disable automatic updates.
Updating the widget too often will have a bad impact on the battery. The minimum value is 30
minutes.
Widget name - the name that will appear in the widgets list.

As these arguments are read by the compiler, only strings or numbers are accepted.

Events:

The above code checks the Intent message that caused this service to start and is responsible for
raising the events related to the widget. It returns true if an event was raised.
The widget raises two events. RequestUpdate is raised when the widget needs to update itself. It
will fire after adding the widget to the screen, after the device has booted, based on the scheduled
updating interval (if set) or after the application was updated.
The Disabled event is raised when the last instance of our widget is removed from the screen.
17 Widgets 236 Basic4Android Beginner's Guide

As mentioned above all views support the Click event. All that needs to be done in order to handle
the click event of a button named Button1 is to add a sub named Button1_Click (the sub name
should actually match the EventName property which is by default the same as the name).
For example if you want to show the main Activity when the user presses on Button1 you can use
this code:

Modifying the widget:


It is not possible to directly access the widget views. Instead we need to use one of the
RemoteView.Set methods.
If we want to change the text of a label named Label1 then we need to write the following code:

After writing all the changes we call rv.UpdateWidget to send the updates to the widget.

A simple example is available in the forum : HomeWidgets.

The example adds a simple widget. The widget doesn't do anything useful.
17 Widgets 237 Basic4Android Beginner's Guide

17.2 Widgets Part II

In this part we will build a "quote of the day" widget.

We will start with the layout. The widget is made of a Label for the text and an ImageView for the
arrow button.

The layout in the designer:

You can see in the above picture that we use two panels. The base panel named pnlBase is a
transparent panel (Alpha=0). The base panel contains another panel which is the grey panel.
The purpose of the transparent panel is to add some padding to the other views. The widget size is
determined by the base panel. Without the transparent panel there will be no margin between the
visible widget and the screen left edge.
17 Widgets 238 Basic4Android Beginner's Guide

We are setting the base panel size to 294x72. This is the recommended size for a 4x1 cells widget.
Tip: in some cases when you change the layout and there is already an existing widget in the device,
the widget doesn't get updated. Remove the widget and add it again to see the change.

Now for the program logic.


Once a day the program fetches 20 quotes from 5 feeds available from Famous Quotes at
BrainyQuote
Then the first quote is displayed. Each time the user presses on the arrow button the next quote is
displayed.
While getting the quotes the first quote of each feed is added to the beginning of the quotes list.
Only the first quote on each feed is new, and we want to start with the new quotes.
Downloading the feeds is done with HttpUtils and parsing them is done with XmlSax library. See
the code for more information.

The widget is configured to be updated automatically every 24 hours. This is done in this line:

After 24 hours or when the widget is first added or after a boot the RequestUpdate event is raised.

First we clear the current quotes and then we fetch the new ones. Note that if the device was
sleeping at this time then the calls are likely to fail as most devices turn off the wifi while sleeping.
In this case new quotes will arrive when the user presses on the arrow button.
In cases like this you should not count on the automatic update to succeed and make sure that there
is an alternative way to update the widget.

Persisting the data. The process running our widget code will not stay alive forever. It will be
killed by the OS at some point.
Therefore we cannot rely on global variables to store our data.
All of the "state" variables must be written to a file.
RandomAccessFile.WriteObject and ReadObject are very useful for such tasks.
Each time that the widget sends a request to our application, Service_Start is called.
Not much is done in this sub:
17 Widgets 239 Basic4Android Beginner's Guide

However if our process is not alive yet then Service_Create will be called before. Service_Create is
an important point, as it allows us to read the previously saved state to memory:

The sourccode is available in the forum : Quotes.


18 B4A Keywords 240 Basic4Android Beginner's Guide

18 B4A Keywords

List of types:
Bit
DateTime
Exception
Keywords
LayoutValues
String
StringBuilder
Timer

18.1 Bit
Bit is a predefined object containing bitwise related methods.
Example:
Dim flags As Int
flags = Bit.Or(100, 200)

Events:
None

Members:

And (N1 As Int, N2 As Int) As Int

Not (N As Int) As Int

Or (N1 As Int, N2 As Int) As Int

ParseInt (Value As String, Radix As Int) As Int

ShiftLeft (N As Int, Shift As Int) As Int

ShiftRight (N As Int, Shift As Int) As Int

ToBinaryString (N As Int) As String

ToHexString (N As Int) As String

ToOctalString (N As Int) As String

UnsignedShiftRight (N As Int, Shift As Int) As Int

Xor (N1 As Int, N2 As Int) As Int

Members description:

And (N1 As Int, N2 As Int) As Int


18 B4A Keywords 241 Basic4Android Beginner's Guide

Returns the bitwise AND of the two values.

Not (N As Int) As Int


Returns the bitwise complement of the given value.

Or (N1 As Int, N2 As Int) As Int


Returns the bitwise OR of the two values.

ParseInt (Value As String, Radix As Int) As Int


Parses Value as an integer using the specified radix.
Radix - Should be between 2 to 36.

ShiftLeft (N As Int, Shift As Int) As Int


Shifts N left.
Shift - Number of positions to shift.

ShiftRight (N As Int, Shift As Int) As Int


Shifts N right.
Keeps the original value sign
Shift - Number of positions to shift.

ToBinaryString (N As Int) As String


Returns a string representation of N in base 2.

ToHexString (N As Int) As String


Returns a string representation of N in base 16.

ToOctalString (N As Int) As String


Returns a string representation of N in base 8.

UnsignedShiftRight (N As Int, Shift As Int) As Int


Shifts N right.
Shifts zeroes in the leftmost positions.
Shift - Number of positions to shift.

Xor (N1 As Int, N2 As Int) As Int


Returns the bitwise XOR of the two values.

18.2 DateTime
Date and time related methods.
DateTime is a predefined object. You should not declare it yourself.
Date and time values are stored as ticks. Ticks are the number of milliseconds since January 1,
1970.
This value is too large to be stored in an Int variable. It should only be stored in a Long
variable.
The methods DateTime.Date and DateTime.Time convert the ticks value to a string.
You can get the current time with DateTime.Now.
18 B4A Keywords 242 Basic4Android Beginner's Guide

Example:
Dim now As Long
now = DateTime.Now
Msgbox("The date is: " & DateTime.Date(now) & CRLF & _
"The time is: " & DateTime.Time(now), "")

Events:
None

Members:

Add (Ticks As Long, Years As Int, Months As Int, Days As Int) As Long

Date (Ticks As Long) As String

DateFormat As String

DateParse (Date As String) As Long

GetDayOfMonth (Ticks As Long) As Int

GetDayOfWeek (Ticks As Long) As Int

GetDayOfYear (Ticks As Long) As Int

GetHour (Ticks As Long) As Int

GetMinute (Ticks As Long) As Int

GetMonth (Ticks As Long) As Int

GetSecond (Ticks As Long) As Int

GetYear (Ticks As Long) As Int

Now As Long [read only]

TicksPerDay As Long

TicksPerHour As Long

TicksPerMinute As Long

TicksPerSecond As Long

Time (Ticks As Long) As String

TimeFormat As String

TimeParse (Time As String) As Long

Members description:
18 B4A Keywords 243 Basic4Android Beginner's Guide

Add (Ticks As Long, Years As Int, Months As Int, Days As Int) As Long
Returns a ticks value which is the result of adding the specified time spans to the given ticks value.
Pass negative values if you want to subtract the values.
Example:
Dim Tomorrow As Long
Tomorrow = DateTime.Add(DateTime.Now, 0, 0, 1)
Log("Tomorrow date is: " & DateTime.Date(Tomorrow))

Date (Ticks As Long) As String


Returns a string representation of the date (which is stored as ticks).
The date format can be set with the DateFormat keyword.
Example:
Log("Today is: " & DateTime.Date(DateTime.Now))

DateFormat As String
Gets or sets the format used to parse date strings.
See this page for the supported patterns: formats.
The default pattern is MM/dd/yyyy (04/23/2002 for example).

DateParse (Date As String) As Long


Parses the given date string and returns its ticks representation.
An exception will be thrown if parsing fails.
Example:
Dim SomeTime As Long
SomeTime = DateTime.DateParse("02/23/2007")

GetDayOfMonth (Ticks As Long) As Int


Returns the day of month component from the ticks value.
Values are between 1 to 31.

GetDayOfWeek (Ticks As Long) As Int


Returns the day of week component from the ticks value.
Values are between 1 to 7.

GetDayOfYear (Ticks As Long) As Int


Returns the day of year component from the ticks value.
Values are between 1 to 366.

GetHour (Ticks As Long) As Int


Returns the hour of day component from the ticks value.
Values are between 0 to 23.

GetMinute (Ticks As Long) As Int


Returns the minutes within a hour component from the ticks value.
Values are between 0 to 59.

GetMonth (Ticks As Long) As Int


18 B4A Keywords 244 Basic4Android Beginner's Guide

Returns the month of year component from the ticks value.


Values are between 1 to 12.

GetSecond (Ticks As Long) As Int


Returns the seconds within a minute component from the ticks value.
Values are between 0 to 59.

GetYear (Ticks As Long) As Int


Returns the year component from the ticks value.

Now As Long [read only]


Gets the current time as ticks (number of milliseconds since January 1, 1970).

TicksPerDay As Long

TicksPerHour As Long

TicksPerMinute As Long

TicksPerSecond As Long

Time (Ticks As Long) As String


Returns a string representation of the time (which is stored as ticks).
The time format can be set with the TimeFormat keyword.
Example:
Log("The time now is: " & DateTime.Date(DateTime.Now))

TimeFormat As String
Gets or sets the format used to parse time strings.
See this page for the supported patterns: formats.
The default pattern is HH:mm:ss (23:45:12 for example).

TimeParse (Time As String) As Long


Parses the given date string and returns its ticks representation.
Note that the returned value date will be today.

18.3 Exception
Holds a thrown exception.
You can access the last thrown exception by calling LastException.
For example:
Try
Dim in As InputStream
in = File.OpenInput(File.DirInternal, "SomeMissingFile.txt")
'...
Catch
Log(LastException.Message)
End Try
If in.IsInitialized Then in.Close
18 B4A Keywords 245 Basic4Android Beginner's Guide

Events:
None

Members:

IsInitialized As Boolean

Message As String [read only]

Members description:

IsInitialized As Boolean

Message As String [read only]

18.4 Keywords
These are the internal keywords.

Events:
None

Members:

Abs (Number As Double) As Double

ACos (Value As Double) As Double

ACosD (Value As Double) As Double

Array

Asc (Char As Char) As Int

ASin (Value As Double) As Double

ASinD (Value As Double) As Double

ATan (Value As Double) As Double

ATanD (Value As Double) As Double

BytesToString (Data() As Byte, StartOffset As Int, Length As Int, CharSet As String) As String

Catch

cE As Double

CharsToString (Chars() As Char, StartOffset As Int, Length As Int) As String

Chr (UnicodeValue As Int) As Char


18 B4A Keywords 246 Basic4Android Beginner's Guide

Continue

Cos (Radians As Double) As Double

CosD (Degrees As Double) As Double

cPI As Double

CRLF As String

Density As Float

Dim

DipToCurrent (Length As Int) As Int

DoEvents

Exit

ExitApplication

False As Boolean

File As File

Floor (Number As Double) As Double

For

GetDeviceLayoutValues As LayoutValues

GetType (object As Object) As String

If

InputList (Items As List, Title As String, CheckedItem As Int) As Int

InputMultiList (Items As List, Title As String) As List

Is

IsBackgroundTaskRunning (ContainerObject As Object, TaskId As Int) As Boolean

IsNumber (Text As String) As Boolean

LastException As Exception

LoadBitmap (Dir As String, FileName As String) As Bitmap

LoadBitmapSample (Dir As String, FileName As String, MaxWidth As Int, MaxHeight As


18 B4A Keywords 247 Basic4Android Beginner's Guide

Int) As Bitmap

Log (Message As String)

Logarithm (Number As Double, Base As Double) As Double

Max (Number1 As Double, Number2 As Double) As Double

Min (Number1 As Double, Number2 As Double) As Double

Msgbox (Message As String, Title As String)

Msgbox2 (Message As String, Title As String, Positive As String, Cancel As String, Negative
As String, Icon As android.graphics.Bitmap) As Int

Not (Value As Boolean) As Boolean

Null As Object

NumberFormat (Number As Double, MinimumIntegers As Int, MaximumFractions As Int) As


String

NumberFormat2 (Number As Double, MinimumIntegers As Int, MaximumFractions As Int,


MinimumFractions As Int, GroupingUsed As Boolean) As String

PerXToCurrent (Percentage As Float) As Int

PerYToCurrent (Percentage As Float) As Int

Power (Base As Double, Exponent As Double) As Double

ProgressDialogHide

ProgressDialogShow (Text As String)

ProgressDialogShow2 (Text As String, Cancelable As Boolean)

QUOTE As String

Regex As Regex

Return

Rnd (Min As Int, Max As Int) As Int

Round (Number As Double) As Long

Round2 (Number As Double, DecimalPlaces As Int) As Double

Select

Sender As Object
18 B4A Keywords 248 Basic4Android Beginner's Guide

Sin (Radians As Double) As Double

SinD (Degrees As Double) As Double

Sqrt (Value As Double) As Double

StartActivity (Activity As Object)

Sub

TAB As String

Tan (Radians As Double) As Double

TanD (Degrees As Double) As Double

ToastMessageShow (Message As String, LongDuration As Boolean)

True As Boolean

Try

Type

Until

While

Members description:

Abs (Number As Double) As Double


Returns the absolute value.

ACos (Value As Double) As Double


Returns the angle measured with radians.

ACosD (Value As Double) As Double


Returns the angle measured with degrees.

Array
Creates a single dimension array of the specified type.
The syntax is: Array As type (list of values).
Example:
Dim Days() As String
Days = Array As String("Sunday", "Monday", ...)

Asc (Char As Char) As Int


Returns the unicode code point of the given character or first character in string.
18 B4A Keywords 249 Basic4Android Beginner's Guide

ASin (Value As Double) As Double


Returns the angle measured with radians.

ASinD (Value As Double) As Double


Returns the angle measured with degrees.

ATan (Value As Double) As Double


Returns the angle measured with radians.

ATanD (Value As Double) As Double


Returns the angle measured with degrees.

BytesToString (Data() As Byte, StartOffset As Int, Length As Int, CharSet As String) As


String
Decodes the given bytes arrays as a string.
Data - The bytes array.
StartOffset - The first byte to read.
Length - Number of bytes to read.
CharSet - The name of the character set.
Example:
Dim s As String
s = BytesToString(Buffer, 0, Buffer.Length, "UTF-8")

Catch
Any exception thrown inside a try block will be caught in the catch block.
Call LastException to get the caught exception.
Syntax:
Try
...
Catch
...
End Try

cE As Double
e (natural logarithm base) constant.

CharsToString (Chars() As Char, StartOffset As Int, Length As Int) As String


Creates a new String by copying the characters from the array.
Copying starts from StartOffset and the number of characters copied equals to Length.

Chr (UnicodeValue As Int) As Char


Returns the character that is represented by the given unicode value.

Continue
Stops executing the current iteration and continues with the next one.

Cos (Radians As Double) As Double


18 B4A Keywords 250 Basic4Android Beginner's Guide

Calculated the trigonometric cosine function. Angle measured in radians.

CosD (Degrees As Double) As Double


Calculated the trigonometric cosine function. Angle measured in degrees.

cPI As Double
PI constant.

CRLF As String
New line character. The value of Chr(13).

Density As Float
Returns the device scale, which is DPI / 160.
(DPI stands for dots per inch).

Dim
Declares a variable.
Syntax:
Declare a single variable:
Dim variable name [As type]
The default type is String.

Declare multiple variables. All variables will be of the specified type.


Dim variable1, variable2, ..., [As type]
Note that the shorthand syntax only applies to Dim keyword.

Declare an array:
Dim variable(Rank1, Rank2, ...) [As type]
Example:Dim Days(7) As String
The actual rank can be omitted for zero length arrays.

DipToCurrent (Length As Int) As Int


Scales the value, which represents a specific length on a default density device (Density = 1.0),
to the current device.
For example, the following code will set the width value of this button to be the same physical size
on all devices.
Button1.Width = DipToCurrent(100)

Note that a shorthand syntax for this method is available. Any number followed by the string 'dip'
will be converted in the same manner (no spaces are allowed between the number and 'dip').
So the previous code is equivalent to:
Button1.Width = 100dip 'dip -> density independent pixel

DoEvents
Processes waiting messages in the messages queue.
DoEvents can be called inside lengthy loops to allow the program to process waiting events.

Exit
Exits the most inner loop.
18 B4A Keywords 251 Basic4Android Beginner's Guide

ExitApplication
Immediately ends the application and stops the process.
Most applications should not use this method and prefer Activity.Finish which lets the OS decide
when the process is killed.

False As Boolean

File As File
Files related methods.

Floor (Number As Double) As Double


Returns the largest double that is smaller or equal to the specified number and is equal to an integer.

For
Syntax:
For variable = value1 To value2 [Step interval]
...
Next
Example:
For i = 1 To 10
Log(i) 'Will print 1 to 10 (inclusive).
Next
If the iterator variable was not declared before it will be of type Int.

GetDeviceLayoutValues As LayoutValues
Returns the device LayoutValues.

Example:
Log(GetDeviceLayoutValues)

GetType (object As Object) As String


Returns a string representing the object's java type.

If
Single line:
If condition Then true-statement [Else false-statement]
Multiline:
If condition Then
statement
Else If condition Then
statement
...
Else
statement
End If

InputList (Items As List, Title As String, CheckedItem As Int) As Int


Shows a modal dialog with a list of items and radio buttons. Pressing on an item will close the
dialog.
18 B4A Keywords 252 Basic4Android Beginner's Guide

Returns the index of the selected item or DialogResponse.Cancel if the user pressed on the back
key.
List - Items to display.
Title - Dialog title.
CheckedItem - The index of the item that will first be selected. Pass -1 if no item should be
preselected.

InputMultiList (Items As List, Title As String) As List


Shows a modal dialog with a list of items and checkboxes. The user can select multiple items.
The dialog is closed by pressing on the "Ok" button.
Returns a list with the indices of the selected items. The list is sorted.
Returns an empty list if the user has pressed on the back key.

Is
Tests whether the object if of the given type.
Example:
For i = 0 To Activity.NumberOfViews - 1
If Activity.GetView(i) Is Button Then
Dim b As Button
b = Activity.GetView(i)
b.Color = Colors.Blue
End If
Next

IsBackgroundTaskRunning (ContainerObject As Object, TaskId As Int) As Boolean


Tests whether a background task, submitted by the container object and with the specified id, is
running.

IsNumber (Text As String) As Boolean


Tests whether the specified string can be safely parsed as a number.

LastException As Exception
Returns the last exception that was caught (if such exists).

LoadBitmap (Dir As String, FileName As String) As Bitmap


Loads the bitmap.
Note that the Android file system is case sensitive.
You should consider using LoadBitmapSample if the image size is large.
The actual file size is not relevant as images are usually stored compressed.
Example:
Activity.SetBackgroundImage(LoadBitmap(File.DirAssets,
"SomeFile.jpg"))

LoadBitmapSample (Dir As String, FileName As String, MaxWidth As Int, MaxHeight As


Int) As Bitmap
Loads the bitmap.
The decoder will subsample the bitmap if MaxWidth or MaxHeight are smaller than the bitmap
dimensions.
This can save a lot of memory when loading large images.
Example:
18 B4A Keywords 253 Basic4Android Beginner's Guide

Activity.SetBackgroundImage(LoadBitmapSample(File.DirAssets,
"SomeFile.jpg", Activity.Width, Activity.Height))

Log (Message As String)


Logs a message. The log can be viewed in the LogCat tab.

Logarithm (Number As Double, Base As Double) As Double

Max (Number1 As Double, Number2 As Double) As Double


Returns the larger number between the two numbers.

Min (Number1 As Double, Number2 As Double) As Double


Returns the smaller number between the two numbers.

Msgbox (Message As String, Title As String)


Shows a modal message box with the specified message and title.
The dialog will show one OK button.
Example:
Msgbox("Hello world", "This is the title")

Msgbox2 (Message As String, Title As String, Positive As String, Cancel As String,


Negative As String, Icon As android.graphics.Bitmap) As Int
Shows a modal message box with the specified message and title.
Message - The dialog message.
Title - The dialog title.
Positive - The text to show for the "positive" button. Pass "" if you don't want to show the button.
Cancel - The text to show for the "cancel" button. Pass "" if you don't want to show the button.
Negative - The text to show for the "negative" button. Pass "" if you don't want to show the button.
Icon - A bitmap that will be drawn near the title. Pass Null if you don't want to show an icon.
Returns one of the DialogResponse values.
Example:
Dim result As Int
result = Msgbox2("This is the message", "This is the title",
"Good", "", "Bad", LoadBitmap(File.DirAssets, "smiley.gif"))
If result = DialogResponse.Positive Then ...

Not (Value As Boolean) As Boolean


Inverts the value of the given boolean.

Null As Object

NumberFormat (Number As Double, MinimumIntegers As Int, MaximumFractions As Int)


As String
Converts the specified number to a string.
The string will include at least Minimum Integers and at most Maximum Fractions digits.
Example:
Log(NumberFormat(12345.6789, 0, 2)) '"12,345.68"
Log(NumberFormat(1, 3 ,0)) '"001"
18 B4A Keywords 254 Basic4Android Beginner's Guide

NumberFormat2 (Number As Double, MinimumIntegers As Int, MaximumFractions As


Int, MinimumFractions As Int, GroupingUsed As Boolean) As String
Converts the specified number to a string.
The string will include at least Minimum Integers, at most Maximum Fractions digits and at least
Minimum Fractions digits.
GroupingUsed - Determines whether to group every three integers.
Example:
Log(NumberFormat2(12345.67, 0, 3, 3, false)) '"12345.670"

PerXToCurrent (Percentage As Float) As Int


Returns the actual size of the given percentage of the activity width.
Example:
Button1.Width = PerXToCurrent(50) 'Button1.Width = 50% * Activity.Width

A shorthand syntax for this method is available. Any number followed by the string '%x'
will be converted in the same manner (no spaces are allowed between the number and '%x').
So the previous code is equivalent to:
Button1.Width = 50%x

PerYToCurrent (Percentage As Float) As Int


Returns the actual size of the given percentage of the activity height.
Example:
Button1.Height = PerYToCurrent(50) 'Button1.Height = 50% * Activity.Height

A shorthand syntax for this method is available. Any number followed by the string '%y'
will be converted in the same manner (no spaces are allowed between the number and '%y').
So the previous code is equivalent to:
Button1.Height = 50%y

Power (Base As Double, Exponent As Double) As Double


Returns the Base value raised to the Exponent power.

ProgressDialogHide
Hides a visible progress dialog. Does not do anything if no progress dialog is visible.

ProgressDialogShow (Text As String)


Shows a dialog with a circular spinning bar and the specified text.
Unlike Msgbox and InputList methods, the code will not block.
You should call ProgressDialogHide to remove the dialog.
The dialog will also be removed if the user presses on the Back key.

ProgressDialogShow2 (Text As String, Cancelable As Boolean)


Shows a dialog with a circular spinning bar and the specified text.
Unlike Msgbox and InputList methods, the code will not block.
You should call ProgressDialogHide to remove the dialog.
Cancelable - Whether the user can dismiss the dialog by pressing on the Back key.

QUOTE As String
Quote character. The value of Chr(34).
18 B4A Keywords 255 Basic4Android Beginner's Guide

Regex As Regex
Regular expressions related methods.

Return
Returns from the current sub and optionally returns the given value.
Syntax: Return [value]

Rnd (Min As Int, Max As Int) As Int


Returns a random integer between Min (inclusive) and Max (exclusive).

Round (Number As Double) As Long


Returns the closest long number to the given number.

Round2 (Number As Double, DecimalPlaces As Int) As Double


Rounds the given number and leaves up to the specified number of fractional digits.

Select
Compares a single value to multiple values.
Select blocks cannot be nested.
Example:
Dim value As Int
value = 7
Select value
Case 1:
Log("One")
Case 2, 4, 6, 8:
Log("Even")
Case 3, 5, 7, 9:
Log("Odd larger than one")
Case Else
Log("Larger than 9")
End Select

Sender As Object
Returns the object that raised the event.
Only valid while inside the event sub.
Example:
Sub Button_Click
Dim b As Button
b = Sender
b.Text = "I've been clicked"
End Sub

Sin (Radians As Double) As Double


Calculated the trigonometric sine function. Angle measured in radians.

SinD (Degrees As Double) As Double


Calculated the trigonometric sine function. Angle measured in degrees.
18 B4A Keywords 256 Basic4Android Beginner's Guide

Sqrt (Value As Double) As Double


Returns the positive square root.

StartActivity (Activity As Object)


Starts an activity or brings it to front if it already exists.
Activity can be a string with the target activity name or it can be the actual activity.
After this call the current activity will be paused and the target activity will be resumed.
This method can also be used to send Intents objects to the system.
Example: StartActivity (Activity2)

Sub
Declares a sub with the parameters and return type.
Syntax: Sub name [(list of parameters)] [As return-type]
Parameters include name and type.
The lengths of arrays dimensions should not be included.
Example:
Sub MySub (FirstName As String, LastName As String, Age As Int,
OtherValues() As Double) As Boolean
...
End Sub
In this example OtherValues is a single dimension array.
The return type declaration is different than other declarations as the array parenthesis follow the
type and not
the name (which does not exist in this case).

TAB As String
Tab character.

Tan (Radians As Double) As Double


Calculated the trigonometric tangent function. Angle measured in radians.

TanD (Degrees As Double) As Double


Calculated the trigonometric tangent function. Angle measured in degrees.

ToastMessageShow (Message As String, LongDuration As Boolean)


Shows a quick little message that goes out automatically.
Message - The text message to show.
LongDuration - If true then shows the message for a long period, otherwise shows the message for a
short period.

True As Boolean

Try
Any exception thrown inside a try block will be caught in the catch block.
Call LastException to get the caught exception.
Syntax:
Try
...
Catch
18 B4A Keywords 257 Basic4Android Beginner's Guide

...
End Try

Type
Declares a structure.
Can only be used inside sub Globals or sub Process_Globals.
Syntax:
Type type-name (field1, field2, ...)
Fields include name and type.
Example:
Type MyType (Name As String, Items(10) As Int)
Dim a, b As MyType
a.Initialize
a.Items(2) = 123

Until
Loops until the condition is true.
Syntax:
Do Until condition
...
Loop

While
Loops while the condition is true.
Syntax:
Do While condition
...
Loop

18.5 LayoutValues
Holds values related to the display.
You can get the values of the the current display by calling GetDeviceLayoutValues.
For example:
Dim lv As LayoutValues
lv = GetDeviceLayoutValues
Log(lv) 'will print the values to the log
Activity.LoadLayout and Panel.LoadLayout return a LayoutValues object with the
values of the
chosen layout variant.

Events:
None

Members:

Height As Int

Scale As Float

toString As String
18 B4A Keywords 258 Basic4Android Beginner's Guide

Width As Int

Members description:

Height As Int
The display height (pixels).

Scale As Float
The device scale value which is equal to 'dots per inch' / 160. For most devices the value will be 1.0
or 1.5 (high resolution).

toString As String

Width As Int
The display width (pixels).

18.6 String
Strings are immutable in Basic4android, which means that you can change the value of a string
variable but you cannot change the text stored in a string object.
So methods like SubString, Trim and ToLowerCase return a new string, they do not change the
value of the current string.
Typical usage:
Dim s As String
s = "some text"
s = s.Replace("a", "b")
You can use StringBuilder if you need a mutable string.
Note that string literals are also string objects:
Log(" some text ".Trim)

Events:
None

Members:

CharAt (Index As Int) As Char

CompareTo (Other As String) As Int

EndsWith (Suffix As String) As Boolean

EqualsIgnoreCase (other As String) As Boolean

GetBytes (Charset As String) As Byte()

IndexOf (SearchFor As String) As Int

IndexOf2 (SearchFor As String, Index As Int) As Int

Length As Int
18 B4A Keywords 259 Basic4Android Beginner's Guide

Replace (Target As String, Replacement As String) As String

StartsWith (Prefix As String) As Boolean

SubString (BeginIndex As Int) As String

SubString2 (BeginIndex As Int, EndIndex As Int) As String

ToLowerCase As String

ToUpperCase As String

Trim As String

Members description:

CharAt (Index As Int) As Char


Returns the character at the given index.

CompareTo (Other As String) As Int


Lexicographically compares the two strings.
Returns a value less than 0 if the current string precedes Other.
Returns 0 if both strings are equal.
Returns a value larger than 0 if the current string comes after Other.
Note that upper case characters precede lower case characters.

Examples:
"abc".CompareTo("da") ' < 0
"abc".CompareTo("Abc") ' > 0
"abc".CompareTo("abca")' < 0

EndsWith (Suffix As String) As Boolean


Returns true if this string ends with the given Suffix.

EqualsIgnoreCase (other As String) As Boolean


Returns true if both strings are equal ignoring their case.

GetBytes (Charset As String) As Byte()


Encodes the string into a new array of bytes.
Example:
Dim Data() As Byte
Data = "Some string".GetBytes("UTF8")

IndexOf (SearchFor As String) As Int


Returns the index of the first occurrence of SearchFor string in the string.
Returns -1 if SearchFor was not found.

IndexOf2 (SearchFor As String, Index As Int) As Int


18 B4A Keywords 260 Basic4Android Beginner's Guide

Returns the index of the first occurrence of SearchFor string in the string.
Starts searching from the given Index.
Returns -1 if SearchFor was not found.

Length As Int
Returns the length of this string.

Replace (Target As String, Replacement As String) As String


Returns a new string resulting from the replacement of all the occurrences of Target with
Replacement.

StartsWith (Prefix As String) As Boolean


Returns true if this string starts with the given Prefix.

SubString (BeginIndex As Int) As String


Returns a new string which is a substring of the original string.
The new string will include the character at BeginIndex and will extend to the end of the string.

Example:
"012345".SubString(2) 'returns "2345"

SubString2 (BeginIndex As Int, EndIndex As Int) As String


Returns a new string which is a substring of the original string.
The new string will include the character at BeginIndex and will extend to the character at
EndIndex, not including the last character.

Example:
"012345".SubString2(2, 4) 'returns "23"

ToLowerCase As String
Returns a new string which is the result of lower casing this string.

ToUpperCase As String
Returns a new string which is the result of upper casing this string.

Trim As String
Returns a copy of the original string without any leading or trailing white spaces.

18.7 StringBuilder
StringBuilder is a mutable string, unlike regular strings which are immutable.
StringBuilder is especially useful when you need to concatenate many strings.
The following code demonstrates the performance boosting of StringBuilder:
Dim start As Long
start = DateTime.Now
'Regular string
Dim s As String
For i = 1 To 5000
s = s & i
18 B4A Keywords 261 Basic4Android Beginner's Guide

Next
Log(DateTime.Now - start)
'StringBuilder
start = DateTime.Now
Dim sb As StringBuilder
sb.Initialize
For i = 1 To 5000
sb.Append(i)
Next
Log(DateTime.Now - start)
Tested on a real device, the first 'for loop' took about 20 seconds and the second took less then tenth
of a second.
The reason is that the code: s = s & i creates a new string each iteration (strings are
immutable).
The method StringBuilder.ToString converts the object to a string.

Events:
None

Members:

Append (Text As String) As StringBuilder

Initialize

Insert (Offset As Int, Text As String) As StringBuilder

IsInitialized As Boolean

Length As Int [read only]

Remove (StartOffset As Int, EndOffset As Int) As StringBuilder

ToString As String

Members description:

Append (Text As String) As StringBuilder


Appends the specified text at the end.
Returns the same object, so you can chain methods.
Example:
sb.Append("First line").Append(CRLF).Append("Second line")

Initialize
Initializes the object.
Example:
Dim sb As StringBuilder
sb.Initialize
sb.Append("The value is: ").Append(SomeOtherVariable).Append(CRLF)

Insert (Offset As Int, Text As String) As StringBuilder


18 B4A Keywords 262 Basic4Android Beginner's Guide

Inserts the specified text at the specified offset.

IsInitialized As Boolean

Length As Int [read only]


Returns the number of characters.

Remove (StartOffset As Int, EndOffset As Int) As StringBuilder


Removes the specified characters.
StartOffset - The first character to remove.
EndOffset - The ending index. This character will not be removed.

ToString As String
Converts the object to a string.

18.8 Timer
A Timer object generates ticks events at specified intervals.
Using a timer is a good alternative to a long loop, as it allows the UI thread to handle other events
and messages.
Note that the timer events will not fire while the UI thread is busy running other code (unless you
call DoEvents keyword).
The timer Enabled property is set to False by default. To make it start working you should change it
to True.
Timer events will not fire when the activity is paused, or if a blocking dialog (like Msgbox) is
visible.
Timers should be declared in Sub Process_Globals. Otherwise you may get multiple timers
running when the activity is recreated.
It is also important to disable the timer when the activity is pausing and then enable it when it
resumes. This will save CPU and battery.

Events:
Tick

Members:

Enabled As Boolean

Initialize (EventName As String, Interval As Long)

Interval As Long

Members description:

Enabled As Boolean
Gets or sets whether the timer is enabled (ticking).

Initialize (EventName As String, Interval As Long)


Initializes the timer with the event sub prefix and the specified interval (measured in milliseconds).
IMPORTANT: this object should be declared in Sub Process_Globals.
18 B4A Keywords 263 Basic4Android Beginner's Guide

Example:
Timer1.Initialize("Timer1", 1000)
Timer1.Enabled = True

Sub Timer1_Tick
'Handle tick events
End Sub

Interval As Long
Gets or sets the interval between tick events, measured in milliseconds.
19 Views 264 Basic4Android Beginner's Guide

19 Views

List of types:
Activity
Button
CheckBox
EditText
ImageView
Label
ListView
Panel
ProgressBar
RadioButton
ScrollView
SeekBar
Spinner
TabHost
ToggleButton
View
WebView

19.1 Activity
Each activity module include a predefined Activity object.
Activity is the main component of your application.
Activities have three special life cycle related event: Activity_Create, Activity_Resume and
Activity_Pause.
See this tutorial for more information about activities and processes life cycle: Life cycle tutorial.

You can add and remove views to this activity with AddView and RemoveViewAt methods.
You can also load a layout file with LoadLayout.
The Touch event can be used to handle user touches.
The first parameter of this event is the Action parameter. The parameter values can be
ACTION_DOWN,
ACTION_MOVE or ACTION_UP. Use this value to find the user current action.
The KeyPress event occurs when the user has pressed on the key and assuming that no other view
has consumed this event (like EditText).
When handling the KeyPress event you should return a boolean value which tells whether the key
press event was consumed.
For example if the user pressed on the Back key and you return True then the OS will not close your
activity.

Sub Activity_KeyPress (KeyCode As Int) As Boolean


If Keycode = KeyCodes.KEYCODE_BACK Then
Return True
Else
Return False
End If
End Sub
You can add menu items to the activity with AddMenuItem method. Note that this method should
19 Views 265 Basic4Android Beginner's Guide

only be called inside


Activity_Create event.

Events:
Touch (Action As Int, X As Float, Y As Float)
KeyPress (KeyCode As Int) As Boolean 'return true if you want to consume the event
Click
LongClick

Members:

ACTION_DOWN As Int

ACTION_MOVE As Int

ACTION_UP As Int

AddMenuItem (Title As String, EventName As String)

AddMenuItem2 (Title As String, EventName As String, Bitmap As android.graphics.Bitmap)

AddView (View As android.view.View, Left As Int, Top As Int, Width As Int, Height As Int)

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Finish

GetView (Index As Int) As View

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

LoadLayout (Layout As String) As LayoutValues

NumberOfViews As Int [read only]

RemoveView
19 Views 266 Basic4Android Beginner's Guide

RemoveViewAt (Index As Int)

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Title As CharSequence

Top As Int

Width As Int

Members description:

ACTION_DOWN As Int

ACTION_MOVE As Int

ACTION_UP As Int

AddMenuItem (Title As String, EventName As String)


Adds a menu item to the activity.
Title - Menu item title.
EventName - The prefix name of the sub that will handle the click event.
This method should only be called inside sub Activity_Create.
Note that the 'Sender' value inside the click event equals to the clicked menu item text.
Example:
Activity.AddMenuItem("Open File", "OpenFile")
...
Sub OpenFile_Click
...
End Sub

AddMenuItem2 (Title As String, EventName As String, Bitmap As


android.graphics.Bitmap)
Adds a menu item to the activity.
Title - Menu item title.
EventName - The prefix name of the sub that will handle the click event.
Bitmap - Bitmap to draw as the item background.
Only the first five (or six if there are six total) menu items display icons.
This method should only be called inside sub Activity_Create.
Note that the 'Sender' value inside the click event equals to the clicked menu item text.
Example:
Activity.AddMenuItem2("Open File", "OpenFile",
LoadBitmap(File.DirAssets, "SomeImage.png"))
19 Views 267 Basic4Android Beginner's Guide

...
Sub OpenFile_Click
...
End Sub

AddView (View As android.view.View, Left As Int, Top As Int, Width As Int, Height As
Int)
Adds a view to this activity.

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Finish
Closes this activity.

GetView (Index As Int) As View


Gets the view that is stored in the specified index.

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int
19 Views 268 Basic4Android Beginner's Guide

LoadLayout (Layout As String) As LayoutValues


Loads a layout file (.bal).
Returns the LayoutValues of the actual layout variant that was loaded.

NumberOfViews As Int [read only]


Returns the number of child views.

RemoveView
Removes this view from its parent.

RemoveViewAt (Index As Int)


Removes the view that is stored in the specified index.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Title As CharSequence

Top As Int

Width As Int
Gets or sets the view's width.

19.2 Button

A Button view.
If you change the button's background you will usually want to use StateListDrawable which allows
you to set the "default" drawable
and the "pressed" drawable.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
19 Views 269 Basic4Android Beginner's Guide

Down
Up
Click
LongClick

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface
19 Views 270 Basic4Android Beginner's Guide

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
19 Views 271 Basic4Android Beginner's Guide

Tries to set the focus to this view.


Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.3 CheckBox

A CheckBox view. Unlike RadioButtons each CheckBox can be checked independently.


This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
CheckedChange(Checked As Boolean)

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Checked As Boolean

Color As Int [write only]


19 Views 272 Basic4Android Beginner's Guide

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.
19 Views 273 Basic4Android Beginner's Guide

Checked As Boolean

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
19 Views 274 Basic4Android Beginner's Guide

Gets or sets the Tag value. This is a place holder which can used to store additional data.

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.4 EditText

EditText view is a view that allows the user to write free text (similar to WinForms TextBox).
The EditText has two modes; SingleLine and MultiLine. You can set it to be multiline by calling
EditText1.SingleLine = False
On most devices the soft keyboard will show automatically when the user presses on the EditText.
You can change the InputType property and change the type of keyboard that appears.
For example: EditText1.InputType = EditText1.INPUT_TYPE_NUMBERS will cause
the numeric keyboard to appear when
the user presses on the EditText. Note that it will also cause the EditText to only accept numbers.

The TextChanged event fires whenever the text changes and it includes the old and new strings.
The EnterPressed event fires when the user presses on the enter key or action key (Done or Next).
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
TextChanged (Old As String, New As String)
EnterPressed

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Enabled As Boolean

ForceDoneButton As Boolean [write only]


19 Views 275 Basic4Android Beginner's Guide

Gravity As Int

Height As Int

Hint As String

HintColor As Int

Initialize (EventName As String)

INPUT_TYPE_DECIMAL_NUMBERS As Int

INPUT_TYPE_NONE As Int

INPUT_TYPE_NUMBERS As Int

INPUT_TYPE_PHONE As Int

INPUT_TYPE_TEXT As Int

InputType As Int

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

PasswordMode As Boolean [write only]

RemoveView

RequestFocus As Boolean

SelectAll

SelectionStart As Int

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

SingleLine As Boolean [write only]

Tag As Object
19 Views 276 Basic4Android Beginner's Guide

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int

Wrap As Boolean [write only]

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

ForceDoneButton As Boolean [write only]


By default the OS sets the virtual keyboard action key to display Done or Next according to the
specific layout.
You can force it to display Done by setting this value to True.
Example:
EditText1.ForceDoneButton = True

Gravity As Int

Height As Int

Hint As String
Gets or sets the text that will appear when the EditText is empty.
Example:
EditText1.Hint = "Enter username"

HintColor As Int
19 Views 277 Basic4Android Beginner's Guide

Gets or sets the hint text color.


Example:
EditText1.HintColor = Colors.Gray

Initialize (EventName As String)

INPUT_TYPE_DECIMAL_NUMBERS As Int
Numeric keyboard will be displayed. Numbers, decimal point and minus sign are accepted.

INPUT_TYPE_NONE As Int
No keyboard will be displayed.

INPUT_TYPE_NUMBERS As Int
Numeric keyboard will be displayed. Only numbers are accepted.

INPUT_TYPE_PHONE As Int
Keyboard will be displayed in phone mode.

INPUT_TYPE_TEXT As Int
Default text mode.

InputType As Int
Gets or sets the input type flag. This flag is used to determine the settings of the virtual keyboard.
Example:
EditText1.InputType = EditText1.INPUT_TYPE_NUMBERS

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

PasswordMode As Boolean [write only]


Sets whether the EditText should be in password mode and hide the actual characters.
19 Views 278 Basic4Android Beginner's Guide

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SelectAll
Selects the entire text.

SelectionStart As Int
Gets or sets the selection start position (or the cursor position).
Returns -1 if there is no selection or cursor.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

SingleLine As Boolean [write only]


Sets whether the EditText should be in single line mode or multiline mode.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int
Gets or sets the view's width.

Wrap As Boolean [write only]


Sets whether the text content will wrap within the EditText bounds. Relevant when the EditText is
in multiline mode.
Example:
EditText1.Wrap = False
19 Views 279 Basic4Android Beginner's Guide

19.5 ImageView

A view that shows an image.


You can assign a bitmap using the Bitmap property.
The Gravity property changes the way the image appears.
The two most relevant values are Gravity.FILL (which will cause the image to fill the entire view)
and Gravity.CENTER (which will draw the image in the view's center).
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
Click
LongClick

Members:

Background As android.graphics.drawable.Drawable

Bitmap As android.graphics.Bitmap

BringToFront

Color As Int [write only]

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int
19 Views 280 Basic4Android Beginner's Guide

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Top As Int

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

Bitmap As android.graphics.Bitmap
Gets or sets the bitmap assigned to the ImageView.
Example:
ImageView1.Bitmap = LoadBitmap(File.DirAssets, "someimage.jpg")

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Gravity As Int
Gets or sets the gravity assigned to the bitmap.
Example:
ImageView1.Gravity = Gravity.Fill

Height As Int

Initialize (EventName As String)

Invalidate
19 Views 281 Basic4Android Beginner's Guide

Invalidates the whole view forcing the view to redraw itself.


Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Visible As Boolean

Width As Int
Gets or sets the view's width.
19 Views 282 Basic4Android Beginner's Guide

19.6 Label

A Label view that shows read-only text.


This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
Click
LongClick

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Text As String
19 Views 283 Basic4Android Beginner's Guide

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean
19 Views 284 Basic4Android Beginner's Guide

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int
Gets or sets the view's width.
19 Views 285 Basic4Android Beginner's Guide

19.7 ListView

ListView is a very useful view that can handle large and small lists.
The ListView raises two events. ItemClick is raised when an item is clicked and ItemLongClick is
raised when an item is clicked and held.
See the ListView tutorial for more information.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
ItemClick (Position As Int, Value As Object)
ItemLongClick (Position As Int, Value As Object)

Members:

AddSingleLine (Text As String)

AddSingleLine2 (Text As String, ReturnValue As Object)

AddTwoLines (Text1 As String, Text2 As String)

AddTwoLines2 (Text1 As String, Text2 As String, ReturnValue As Object)

AddTwoLinesAndBitmap (Text1 As String, Text2 As String, Bitmap As


android.graphics.Bitmap)
19 Views 286 Basic4Android Beginner's Guide

AddTwoLinesAndBitmap2 (Text1 As String, Text2 As String, Bitmap As


android.graphics.Bitmap, ReturnValue As Object)

Background As android.graphics.drawable.Drawable

BringToFront

Clear

Color As Int [write only]

Enabled As Boolean

FastScrollEnabled As Boolean

GetItem (Index As Int) As Object

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveAt (Index As Int)

RemoveView

RequestFocus As Boolean

ScrollingBackgroundColor As Int [write only]

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

SingleLineLayout As SingleLineLayout [read only]

Size As Int [read only]

Tag As Object

Top As Int
19 Views 287 Basic4Android Beginner's Guide

TwoLinesAndBitmap As TwoLinesAndBitmapLayout [read only]

TwoLinesLayout As TwoLinesLayout [read only]

Visible As Boolean

Width As Int

Members description:

AddSingleLine (Text As String)


Adds a single line item.
Example:
ListView1.AddSingleLine("Sunday")

AddSingleLine2 (Text As String, ReturnValue As Object)


Adds a single line item.
The specified return value will be returned when calling GetItem or in the ItemClick event.
Example:
ListView1.AddSingleLine2("Sunday", 1)

AddTwoLines (Text1 As String, Text2 As String)


Adds a two lines item.
Example:
ListView1.AddTwoLines("This is the first line.", "And this is the
second")

AddTwoLines2 (Text1 As String, Text2 As String, ReturnValue As Object)


Adds a two lines item.
The specified return value will be returned when calling GetItem or in the ItemClick event.

AddTwoLinesAndBitmap (Text1 As String, Text2 As String, Bitmap As


android.graphics.Bitmap)
Adds a two lines and a bitmap item.
Example:
ListView1.AddTwoLinesAndBitmap("First line", "Second line",
LoadBitmap(File.DirAssets, "SomeImage.png"))

AddTwoLinesAndBitmap2 (Text1 As String, Text2 As String, Bitmap As


android.graphics.Bitmap, ReturnValue As Object)
Adds a two lines and a bitmap item.
The specified return value will be returned when calling GetItem or in the ItemClick event.

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.
19 Views 288 Basic4Android Beginner's Guide

Clear
Clears all items from the list.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

FastScrollEnabled As Boolean
Gets or sets whether the fast scroll icon will appear when the user scrolls the list.
The default is false.

GetItem (Index As Int) As Object


Returns the value of the item at the specified position.
Returns the "return value" if it was set and if not returns the text of the first line.

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveAt (Index As Int)


Removes the item at the specified position.

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
19 Views 289 Basic4Android Beginner's Guide

Tries to set the focus to this view.


Returns True if the focus was set.

ScrollingBackgroundColor As Int [write only]


Sets the background color that will be used while scrolling the list.
This is an optimization done to make the scrolling smoother.
Set to Colors.Transparent if the background behind the list is not solid color.
The default is black.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

SingleLineLayout As SingleLineLayout [read only]


Returns the layout that is used to show single line items.
You can change the layout values to change the appearance of such items.
Example:
Dim Label1 As Label
Label1 = ListView1.SingleLineLayout.Label
Label1.TextSize = 20
Label1.TextColor = Colors.Green

Size As Int [read only]


Returns the number of items stored in the list.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

TwoLinesAndBitmap As TwoLinesAndBitmapLayout [read only]


Returns the layout that is used to show two lines and bitmap items.
You can change the layout values to change the appearance of such items.
For example if you want to remove the second label (in all items with this layout):
ListView1.TwoLinesAndBitmap.SecondLabel.Visible = False

TwoLinesLayout As TwoLinesLayout [read only]


Returns the layout that is used to show two lines items.
You can change the layout values to change the appearance of such items.
Example:
Dim Label1 As Label
Label1 = ListView1.TwoLinesLayout.SecondLabel
Label1.TextSize = 20
Label1.TextColor = Colors.Green
19 Views 290 Basic4Android Beginner's Guide

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.8 Panel

A Panel is a view that holds other child views.


You can add child views programmatically or by loading a layout file.
The Panel raises the Touch event. The first parameter of this event is the Action which is one of the
Activity action constants.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
Touch (Action As Int, X As Float, Y As Float)
Click
LongClick

Members:

AddView (View As android.view.View, Left As Int, Top As Int, Width As Int, Height As Int)

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Enabled As Boolean

GetView (Index As Int) As View

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


19 Views 291 Basic4Android Beginner's Guide

IsInitialized As Boolean

Left As Int

LoadLayout (Layout As String) As LayoutValues

NumberOfViews As Int [read only]

RemoveView

RemoveViewAt (Index As Int)

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Top As Int

Visible As Boolean

Width As Int

Members description:

AddView (View As android.view.View, Left As Int, Top As Int, Width As Int, Height As
Int)
Adds a view to this panel.

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

GetView (Index As Int) As View


Gets the view that is stored in the specified index.
19 Views 292 Basic4Android Beginner's Guide

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

LoadLayout (Layout As String) As LayoutValues


Loads a layout file to this panel. Returns the value of the chosen layout variant.

NumberOfViews As Int [read only]


Returns the number of child views.

RemoveView
Removes this view from its parent.

RemoveViewAt (Index As Int)


Removes the view that is stored in the specified index.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
19 Views 293 Basic4Android Beginner's Guide

Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.9 ProgressBar

A progress bar view. The Progress property sets the progress value which is between 0 to 100.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
None

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Enabled As Boolean

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

Progress As Int

RemoveView

RequestFocus As Boolean
19 Views 294 Basic4Android Beginner's Guide

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Top As Int

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean
19 Views 295 Basic4Android Beginner's Guide

Left As Int

Progress As Int
Gets or sets the progress value.

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.10 RadioButton

A RadioButton view. Only one RadioButton in a group can be checked. When a different
RadioButton is checked all others will
automatically be unchecked. Grouping is done by adding RadioButtons to the same activity or
panel.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
CheckedChange(Checked As Boolean)

Members:

Background As android.graphics.drawable.Drawable
19 Views 296 Basic4Android Beginner's Guide

BringToFront

Checked As Boolean

Color As Int [write only]

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int

Members description:
19 Views 297 Basic4Android Beginner's Guide

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Checked As Boolean

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.
19 Views 298 Basic4Android Beginner's Guide

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Text As String

TextColor As Int

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.11 ScrollView

ScrollView is a view that contains other views and allows the user to vertically scroll those views.
See the ScrollView tutorial for more information.
The ScrollView has an inner panel which actually contains the child views.
You can add views by calling: ScrollView1.Panel.AddView(...)
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
19 Views 299 Basic4Android Beginner's Guide

None

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Enabled As Boolean

FullScroll (Bottom As Boolean)

Height As Int

Initialize (Height As Int)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

Panel As Panel [read only]

RemoveView

RequestFocus As Boolean

ScrollPosition As Int

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Top As Int

Visible As Boolean

Width As Int

Members description:
19 Views 300 Basic4Android Beginner's Guide

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

FullScroll (Bottom As Boolean)


Scrolls the scroll view to the top or bottom.

Height As Int

Initialize (Height As Int)


Initializes the ScrollView and sets its inner panel height to the given height.
You can later change this height by calling ScrollView.Panel.Height.

Dim ScrollView1 As ScrollView


ScrollView1.Initialize(1000dip)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

Panel As Panel [read only]


Returns the panel which you can use to add views to.
Example:
ScrollView1.Panel.AddView(...)
19 Views 301 Basic4Android Beginner's Guide

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

ScrollPosition As Int
Gets or sets the scroll position.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.12 SeekBar

A view that allows the user to set a value by dragging a slider. Similar to WinForms TrackBar.
The ValueChanged event is raised whenever the value is changed. The UserChanged parameter can
be used to distinguish between changes done by the user and changes done programmatically.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
ValueChanged (Value As Int, UserChanged As Boolean)

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]


19 Views 302 Basic4Android Beginner's Guide

Enabled As Boolean

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

Max As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Top As Int

Value As Int

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.
19 Views 303 Basic4Android Beginner's Guide

Enabled As Boolean

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

Max As Int
Gets or sets the maximum allows value.

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Value As Int
19 Views 304 Basic4Android Beginner's Guide

Gets or sets the current value.

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.13 Spinner

A folded list that opens when the user clicks on it and allows the user to choose an item. Similar to
WinForms ComboBox.
The ItemClick event is raised each time a user presses on an item (even if it is the already selected
item).
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
ItemClick (Position As Int, Value As Object)

Members:

Add (Item As String)

AddAll (List As List)

Background As android.graphics.drawable.Drawable

BringToFront

Clear

Color As Int [write only]

Enabled As Boolean

GetItem (Index As Int) As String

Height As Int

IndexOf (value As String) As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


19 Views 305 Basic4Android Beginner's Guide

IsInitialized As Boolean

Left As Int

Prompt As String

RemoveAt (Index As Int)

RemoveView

RequestFocus As Boolean

SelectedIndex As Int

SelectedItem As String [read only]

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Size As Int [read only]

Tag As Object

Top As Int

Visible As Boolean

Width As Int

Members description:

Add (Item As String)


Adds an item.
Example:
Spinner1.Add("Sunday")

AddAll (List As List)


Adds multiple items.
Example:
Spinner1.AddAll(Array As String("Sunday", "Monday", ...))

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.
19 Views 306 Basic4Android Beginner's Guide

Clear
Clears all items.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

GetItem (Index As Int) As String


Returns the item at the specified index.

Height As Int

IndexOf (value As String) As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

Prompt As String
Gets or sets the title that will be displayed when the spinner is opened.

RemoveAt (Index As Int)


Removes the item at the specified index.

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
19 Views 307 Basic4Android Beginner's Guide

Tries to set the focus to this view.


Returns True if the focus was set.

SelectedIndex As Int
Gets or sets the index of the selected item. Returns -1 if no item is selected.

SelectedItem As String [read only]


Returns the value of the selected item.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Size As Int [read only]


Returns the number of items.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Visible As Boolean

Width As Int
Gets or sets the view's width.
19 Views 308 Basic4Android Beginner's Guide

19.14 TabHost

TabHost is a view that contains multiple tab pages. Each tab page contains other child views.
See the TabHost tutorial for more information.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
TabChanged
Click
LongClick

Members:

AddTab (Title As String, LayoutFile As String)

AddTab2 (Title As String, View As android.view.View)

AddTabWithIcon (Title As String, DefaultBitmap As android.graphics.Bitmap,


SelectedBitmap As android.graphics.Bitmap, LayoutFile As String)

AddTabWithIcon2 (Title As String, DefaultBitmap As android.graphics.Bitmap,


SelectedBitmap As android.graphics.Bitmap, View As android.view.View)

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

CurrentTab As Int

Enabled As Boolean

Height As Int
19 Views 309 Basic4Android Beginner's Guide

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

TabCount As Int [read only]

Tag As Object

Top As Int

Visible As Boolean

Width As Int

Members description:

AddTab (Title As String, LayoutFile As String)


Adds a tab page.
Title - The page title.
LayoutFile - A layout file describing the page layout.
Example:
TabHost1.AddTab("Page 1", "page1.bal")

AddTab2 (Title As String, View As android.view.View)


Adds a tab page.
Title - The page title.
View - The page content. Usually the view should be a panel containing other views.

AddTabWithIcon (Title As String, DefaultBitmap As android.graphics.Bitmap,


SelectedBitmap As android.graphics.Bitmap, LayoutFile As String)
Adds a tab page. The tab title includes an icon.
Title - The page title.
DefaultBitmap - The icon that will be drawn when the page is not selected.
19 Views 310 Basic4Android Beginner's Guide

SelectedBitmap - The icon that will be drawn when the page is selected.
LayoutFile - A layout file describing the page layout.
Example:
Dim bmp1, bmp2 As Bitmap
bmp1 = LoadBitmap(File.DirAssets, "ic.png")
bmp2 = LoadBitmap(File.DirAssets, "ic_selected.png")
TabHost1.AddTabWithIcon("Page 1", bmp1, bmp2,"tabpage1.bal")

AddTabWithIcon2 (Title As String, DefaultBitmap As android.graphics.Bitmap,


SelectedBitmap As android.graphics.Bitmap, View As android.view.View)
Adds a tab page. The tab title includes an icon.
Title - The page title.
DefaultBitmap - The icon that will be drawn when the page is not selected.
SelectedBitmap - The icon that will be drawn when the page is selected.
View - The page content. Usually the view should be a panel containing other views.

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

CurrentTab As Int
Gets or sets the current tab.
Example:
TabHost1.CurrentTab = (TabHost1.CurrentTab + 1) Mod
TabHost1.TabCount 'switch to the next tab.

Enabled As Boolean

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


19 Views 311 Basic4Android Beginner's Guide

Invalidates the given rectangle.


Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

TabCount As Int [read only]


Returns the number of tab pages.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Visible As Boolean

Width As Int
Gets or sets the view's width.
19 Views 312 Basic4Android Beginner's Guide

19.15 ToggleButton

A ToggleButton view. This view which is similar to a button has two modes: ON and OFF.
When the user presses on it, it will change its mode.
You can set the text with the TextOn and TextOff properties.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
CheckedChange(Checked As Boolean)

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Checked As Boolean

Color As Int [write only]

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)


19 Views 313 Basic4Android Beginner's Guide

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

TextColor As Int

TextOff As String

TextOn As String

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Checked As Boolean

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Gravity As Int

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


19 Views 314 Basic4Android Beginner's Guide

Invalidates the given rectangle.


Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

TextColor As Int

TextOff As String
Gets or sets the text that will appear in the OFF mode.

TextOn As String
Gets or sets the text that will appear in the ON mode.

TextSize As Float

Top As Int

Typeface As android.graphics.Typeface

Visible As Boolean

Width As Int
Gets or sets the view's width.
19 Views 315 Basic4Android Beginner's Guide

19.16 View
View is a special type of object. You cannot create new View objects. However all other view types
can be assigned to a view variable.
This allows you to access the shared properties of all views.
For example this code hides all views of an activity:
For i = 0 To Activity.NumberOfViews - 1
Dim v As View
v = Activity.GetView(i)
v.Visible = False
Next
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Events:
Click
LongClick

Members:

Background As android.graphics.drawable.Drawable

BringToFront

Color As Int [write only]

Enabled As Boolean

Height As Int

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

Left As Int

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object
19 Views 316 Basic4Android Beginner's Guide

Top As Int

Visible As Boolean

Width As Int

Members description:

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Height As Int

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

Left As Int

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.
19 Views 317 Basic4Android Beginner's Guide

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Visible As Boolean

Width As Int
Gets or sets the view's width.

19.17 WebView

The WebView view uses the internal WebKit engine to display Html pages.
The page displayed can be an online page loaded with LoadUrl or a Html string loaded with
LoadHtml.
This is an 'Activity Object', it cannot be declared under Sub Process_Globals.

Permissions:
android.permission.INTERNET

Events:
None

Members:

Back

Background As android.graphics.drawable.Drawable
19 Views 318 Basic4Android Beginner's Guide

BringToFront

Color As Int [write only]

Enabled As Boolean

Forward

Height As Int

Initialize (EventName As String)

Invalidate

Invalidate2 (Rect As android.graphics.Rect)

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)

IsInitialized As Boolean

JavaScriptEnabled As Boolean

Left As Int

LoadHtml (Html As String)

LoadUrl (Url As String)

RemoveView

RequestFocus As Boolean

SendToBack

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)

Tag As Object

Top As Int

Url As String [read only]

Visible As Boolean

Width As Int

ZoomEnabled As Boolean

Members description:
19 Views 319 Basic4Android Beginner's Guide

Back
Goes back to the previous Url.

Background As android.graphics.drawable.Drawable
Gets or sets the background drawable.

BringToFront
Changes the Z order of this view and brings it to the front.

Color As Int [write only]


Sets the background of the view to be a ColorDrawable with the given color.
If the current background is of type GradientDrawable or ColorDrawable the round corners will be
kept.

Enabled As Boolean

Forward
Goes forward to the next Url.

Height As Int

Initialize (EventName As String)

Invalidate
Invalidates the whole view forcing the view to redraw itself.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate2 (Rect As android.graphics.Rect)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

Invalidate3 (Left As Int, Top As Int, Right As Int, Bottom As Int)


Invalidates the given rectangle.
Redrawing will only happen when the program can process messages. Usually when it finishes
running the current code.

IsInitialized As Boolean

JavaScriptEnabled As Boolean
Gets or sets whether JavaScript is enabled.
JavaScript is enabled by default.

Left As Int

LoadHtml (Html As String)


19 Views 320 Basic4Android Beginner's Guide

Loads the given Html.


Example:
WebView1.LoadHtml("<html><body>Hello world!</body></html>")
You can use "file:///android_asset" to access files added with the file manager:
WebView1.LoadHtml("<html><body><img
src='file:///android_asset/someimage.jpg'/></body></html>")
Note that files added with the file manager should be accessed with a lower cased name.

LoadUrl (Url As String)


Loads the given Url.
Example:
WebView1.LoadUrl("http://www.google.com")

RemoveView
Removes this view from its parent.

RequestFocus As Boolean
Tries to set the focus to this view.
Returns True if the focus was set.

SendToBack
Changes the Z order of this view and sends it to the back.

SetBackgroundImage (Bitmap As android.graphics.Bitmap)

SetLayout (Left As Int, Top As Int, Width As Int, Height As Int)


Changes the view position and size.

Tag As Object
Gets or sets the Tag value. This is a place holder which can used to store additional data.

Top As Int

Url As String [read only]


Returns the current Url.

Visible As Boolean

Width As Int
Gets or sets the view's width.

ZoomEnabled As Boolean
Gets or sets whether the internal zoom feature is enabled.
The zoom feature is enabled by default.
20 VB6 versus B4A 321 Basic4Android Beginner's Guide

20 VB6 versus B4A


Written by : nfordbscndrd http://www.basic4ppc.com/forum/members/nfordbscndrd.html

VB6 B4A
=== ===
controls Views (button, edittext, label, etc.)
In the VB6 code window, the top left drop-down list contains all
the controls you have placed in the current form and the right list
contains all the events for each control. The equivalent in B4A can
be found by clicking on Designer - Tools - Generate Members. Once
you have created Subs in the program coding window, the tab "Modules"
on the right side will list each of the Subs.

In B4A, you start by typing "Sub [viewName]" followed by a space and


follow the prompts, pressing Enter after each selection until B4A
ends with "EventName" highlighted. This is where you would type in
the name of the Sub.

Dim/ReDim:
---------
Dim Array(n) Dim Array(n+1)
While "n" is the last index number in VB6, it indicates the number
of array elements when used in B4A. For example, to Dim an array
with 0-32 elements in VB6, you would say Dim A(32), while to convert
this to B4A, you need to change it to Dim A(33), yet index #33 is
never used (doing so would cause an out-of-range error).

ReDim Array() Dim Array(n+1) -- to clear an array, just Dim it again.

[Dim a Int: Dim b as Boolean]


If Not b Then... If Not(b) Then...
If b Then... same
If b = True Then same
If a Then... If a > 0 Then...
B4A does not treat any non-zero value as True like VB6.
a = a + b If b = True Then a = a - 1
Boolean's value cannot be used in a math function in B4A.

Global Const x=1 B4A does not have a Global Const function.
In Sub Globals, you can say Dim x as Int: x = 1
but x is not a constant (it's value can be changed).

Loops, If-Then, Select Case:


---------------------------
Do [Until/While] same
Loop [Until/While] Loop [Until/While not allowed.]
For - Next same
For i... - Next i The loop variable (i) is not allowed with Next.
Exit Do/For Exit
If - Then - Else same, except VB's ElseIf is "Else If" in B4A; ditto EndIf

--- Continue [Skips to Next in For-Next loop]


For i = 1 to 6 For i = 1 to 6
If i = 4 Then If i = 4 Then Continue
...code... ...code...
End If ...
Next Next

Select Case [expr] Select [value]

Colors:
------
20 VB6 versus B4A 322 Basic4Android Beginner's Guide

L1.BackColor = L1.Color = Colors.Red


vbRed
L1.ForeColor = L1.TextColor = Colors.Black
vbBlack

Calling a sub:
-------------
SubName x, y SubName(x, y)

Sub SubName() Sub SubName() As Int/String/etc. -- a Global variable cannot


be
a parameter, so say that "player" is a Global variable,
you
cannot say: PlayCard(player). Instead you have to say:
i=player: PlayCard(i)

Function FName() Sub FName() As [var.type]


As [var.type] In B4A, any Sub can be used like a Function by adding a
variable type such as
Sub CheckX(x As Int) As Boolean
...optional code...
If x = [desired value] Then Return True
...optional code...
End Sub
If no Return is given, then zero/False/"" is returned.
The calling code does not have to reference the returned
value, so that while "If CheckX(x) = True..." is valid,
so is just "CheckX(x)"
Exit Sub Return
Exit Function Return [value]

General:
-------
DoEvents same, except that Erel says:
"Calling DoEvents in a loop consumes a lot of resources and
it doesn't allow the system to process all waiting messages
properly." This was in response to my pointing out that
while
in a Do Loop with DoEvents in it, WebView could not be
loaded
or if loaded, would not process a hyperlink click. And
Agraham
says: "Looping is bad practice on mobile devices. The CPU
will
be constantly executing code and using battery power as the
code will never get back to the OS idle loop where the
hardware
power saving measures are invoked."

Format() NumberFormat & NumberFormat2 [see documentation]

InputBox($) InputList(Items as List, Title, CheckedItem as Int) as Int


Shows list of choices with radio buttons. Returns index.
CheckedItem is the default.
InputMultiList(Items as List, Title) As List
Usere can select multiple items via checkboxes.
Returns list with the indexes of boxes checked.

MsgBox "text" MsgBox("text", "title")


i=MsgBox() MsgBox2(Message, Title, Positive, Cancel, Negative, Icon) as
Int
Displays three buttons with text to display for buttons
(Positive, Cancel, Negative)
Icon is displayed near the title and is specified like:
LoadBitmap(File.DirAssets, "[filename].gif")
20 VB6 versus B4A 323 Basic4Android Beginner's Guide

--- ToastMessageShow(text, b) [where b=True for long duration]

Rnd is < 1 Rnd(min, max) is integer >= min to < max

Round(n) same, or Round2(n, x) where x=number of decimal places

i = Val(string) If IsNumber(string) Then i = string Else i = 0 --


An attempt to use i=string "throws an exception" if the
string is
not numbers.

control.SetFocus view.RequestFocus

n / 0 : error n / 0 = 2147483647 -- B4A does not "throw an exception" for


division by 0, but it does return 2147483647 no matter
what the value of "n" is.

x = Shell("...") See "Intent". This is not a complete replacement, but allows


code such as the following from the B4A forum (by Erel):
Dim pi As PhoneIntents
StartActivity
(pi.OpenBrowser("file:///sdcard/yourfile.html"))

t = Timer t = DateTime.Now ' Ticks are number of milliseconds since 1-


1-70

TabIndex:
--------
In VB6, TabIndex can be set to control the order in which controls get focus
when Tab is pressed. According to Erel, in B4A:
"Android handles the sequence according to their position. You can set
EditText.ForceDone = True in all your EditTexts. Then catch the
EditText_EnterPressed event and explicitly set the focus to the next
view (with EditText.RequestFocus)."

Setting Label Transparency:


--------------------------
Properties - Back Style Designer - Drawable - Alpha

Constants:
---------
"" Quote = Chr$(34)
vbCr CRLF = Chr$(13)
vbCrLf none

String "Members":
----------------
VB6 uses a character position pointer starting with 1.
B4A uses a character Index pointer starting with 0.

VB6 B4A
Mid$("abcde", 1, 1) = "a" = letter array index 0 -- "a" = "abcde".CharAt(0)
Mid$("abcde", 2, 1) = "b" = letter array index 1
Mid$("abcde", 3, 1) = "c" = letter array index 2
Mid$("abcde", 4, 1) = "d" = letter array index 3
Mid$("abcde", 5, 1) = "e" = letter array index 4

VB6 B4A
=== ===
Mid$(text, n, 1) text.CharAt(n-1)
Mid$(text, n) text.SubString(n-1)
Mid$(text, n, x) [x=length wanted] text.SubString2(n-1, n+x-1) [n+x-1=end
position]
Mid$(text, n, x) = text2 text = text.SubString2(0, n-2) & _
20 VB6 versus B4A 324 Basic4Android Beginner's Guide

text2.SubString2(0, x-1) & _


text.SubString(n-1 + z) where...
z = Min(x, text2.length)
Left$(text, n) [n=num.of chars.] text.SubString2(0, n)
Right$(text, n) text.SubString(text.Length - n + 1)
If a$ = b$... If a.CompareTo(b)...
If Right$(text, n) = text2... If text.EndsWith(text2)...
If Left$(text, n) = text2... If text.StartsWith(text2)...
If Lcase$(text) = Lcase$(text2)... If text.EqualsIgnoreCase(text2)...
x = Len(text) x = text.Length
text = Replace(text, str, str2) text.Replace(str, str2)
Lcase(text) text.ToLowerCase
Ucase(text) text.ToUpperCase
Trim(text) text.Trim
(no LTrim or RTrim in B4A)
Instr(text, string) text.IndexOf(string)
Instr(int, text, string) text.IndexOf2(string, int)
Returns -1 if not found.
Returns char. index, not position.
Starts search at "int".
If Lcase$(x) = Lcase$(y)... If x.EqualsIgnoreCase(y)...
text = Left$(text, n) & s & text.Insert(n, s)
Right$(Text, y)
Asc(s) [where s = a character] same

Error Trapping:
--------------
VB6:
===
Sub SomeSub
On [Local] Error GoTo ErrorTrap
...some code...
On Error GoTo 0 [optional end to error trapping]
...optional additional code...
Exit Sub [to avoid executing ErrorTrap code]
ErrorTrap:
...optional code for error correction...
Resume [optional: "Resume Next" or "Resume [line label]".
End Sub

B4A:
===
Sub SomeSub
Try
...some code...
Catch [only executes if error above]
Log(LastException) [optional]
...optional code for error correction...
End Try
...optional additional code...
End Sub

WIth B4A, if you get an error caught in the middle of a large subroutine, you
can
NOT make a correction and resume within the code you were executing. Only the
code
in "Catch" gets executed. That would seem to make Try-Catch-End Try of use
mainly
during development.

Try-Catch in place of GoTo:


--------------------------
Try-Catch can be used as a substitute for GoTo [line label] for forward, but not
backward, jumps. It cannot be used to replace GoSub, for which B4A has no
equivalent.
20 VB6 versus B4A 325 Basic4Android Beginner's Guide

Start the code with "Try" and replace the [line label] with "Catch".
Replace "GoTo [line label]" with code which will create an exception, which
causes
a jump to "Catch", such as OpenInput("bad path", "bad filename").

"Immediate Window" vs "Logs" Tab


--------------------------------
Comments, variable values, etc., can be displayed in VB6's Immediate
Window by entering into the code "Debug.Print ...".

In the B4A environment, the Logs tab on the right side of the IDE is a
way to show the values of variables, etc., while the code is running.

Both VB6 and (now) B4A allow single-stepping through the code while it
is running and viewing the values of variables. VB6 also allows changing
the value of variables, changing the code, jumping to other lines from
the current line, etc. Because B4A runs on a PC while the app runs on
a separate device, B4A is currently unable to duplicate all of these
VB6 debug features.
21 FAQ 326 Basic4Android Beginner's Guide

21 FAQ
Some of the chapters below have been picked up from the forum.

21.1 "Please save project first" message

When I try to compile or open the Designer I see a message saying: "Please save source code first."
A new project doesn't have a containing folder until it is first saved.
Save your project and this error will go away.

21.2 "Are you missing a library reference" message

Compiler says: "Are you missing a library reference?".

Go to the Libraries tab in the right pane and check the


required libraries.

If you do not know which library a specific object type


belongs to, you can go to the documentation page.

At the bottom of this page there is a long list with all the
objects types.

Pressing on any type will take you to the right library.

Note that the trial version doesn't support libraries. Only


the full version.
21 FAQ 327 Basic4Android Beginner's Guide

21.3 How loading / updating a library

See the Libraries chapter in the guide.

A list of the official and additional libraries with links to the relevant forum threads is shown in the
B4A Wiki here: Libraries

To load or update a library follow the steps below:


 Download the library zip file somewhere.
 Unzip it.
 Copy the xxx.jar and xxx.xml files to the
o B4A Library folder for a standard B4A library
o Additional libraries folder for an additional library.
 Restart the IDE and check the library in the Lib Tab list to select it.

21.4 When do we need to 'Initialize' and when not

View.

For ALL Views:


 To be able to have access to any View by its name you must Dim it in the Sub Globals
routine.

Views added
 in the Designer in a layout file MUST NOT be initialized !
o Just Dim the View in the Sub Globals routine.

and nothing else.

 by code MUST be initilized.


o Dim the View in the Sub Globals routine.

o Initialize it and add it to the Activity (or a Panel) in the Activity_Create routine.

List / Map.

List and Map objects must be Initialized before they can be used.
21 FAQ 328 Basic4Android Beginner's Guide

21.5 Split a long line into two or more lines

To split a long line into two or more lines put an underscore character, seperated by a blank
character, at the end of the line. Look at the example in the chapter below.

Becomes:

21.6 Avoid closing an application

This can be done by intercepting the Activity_KeyPress event.

 We check if the the KeyCode equals the Back key.


 If yes, we ask the user if he really wants to quit the program.
o If 'No' we return True to consume the evnt.
o Otherwise we return False to transmit the event to the OS.

Just as a reminder, the underscore at the end in the 5th line


Answ = Msgbox2("Do you want to quit the program ?", _
means split the line and put the rest on the next line.
21 FAQ 329 Basic4Android Beginner's Guide

21.7 Unwanted events like Click, Touch or others

Proposed by alfcen:

Suppose you have an Activity containing several buttons with Click events.
Now, you add a Panel onto the Activity, thus covering buttons. As you tap on the
panel you will see that a click event was fired on a button on the Activity.
This is NOT a B4A bug, on the contrary, it might be quite useful.
However, if this is not wanted, just add:

21.8 Adding a Menu item

You should also have a look at Example programs / User interfaces.

This is done with the AddMenuItem or AddMenuItem2 methods.


Once a menu item is added you cannot modify it nor remove or disable it.

Activity.AddMenuItem("Title", "EventName")
Activity.AddMenuItem("Title", "EventName", Image)

Examples:

or
21 FAQ 330 Basic4Android Beginner's Guide

21.9 How do I remove a View with the Designer

To remove a View with the Designer you must:


 Select the View to remove either on the device, the Emulator or in the Designer.
 Remove it, in the menu Tools click on Remove Selected View.

21.10 "Process has timeout" message

If you often get this message "Process has timeout" you can change its value:
 In the IDE menu Tools / IDE Options click on Configure Process Timeout.

 And change the value:


21 FAQ 331 Basic4Android Beginner's Guide

21.11 Getting a picture from the gallery

Following code allows you to load a picture from the gallery.

21.12 How to delete x.bal files or other files from a project

To delete files from the project you must use the files Tab in the lower right corner of the IDE.

 Select the files you want to delete.

 Click on and confirm to delete the files.


If you delete the files only in the folder, you will get a meassage for missing files the next
time you start the project.
21 FAQ 332 Basic4Android Beginner's Guide

21.13 Block a screen orientation

To block the orientation either to Portrait or to Landscape.

In the IDE, menu :

Project / Orientations supported:

 Both
 Portrait
 Landscape

It can also be done by code with SetScreenOrientation from the Phone library:

 Landscape
Phone1.SetScreenOrientation(0)

 Portrait
Phone1.SetScreenOrientation(1)

 Both
Phone1.SetScreenOrientation(-1)
21 FAQ 333 Basic4Android Beginner's Guide

21.14 Close second Activity

From the forum:


Referring to the 'twoactivities' tutorial by Erel, I noticed that when back button was pressed from
the main Activity, Activity2 was then shown again.

In the code of Activity2 after StartActivity(Main) add Activity.Finish.

21.15 Taking a screenshot programaticaly

You can take a screenshot of the device or the Emulator with following code:

Sub btnScrShot_LongClick
' Take a screenshot.
Dim Obj1, Obj2 As Reflector
Dim bmp As Bitmap
Dim c As Canvas
Dim now, i As Long
Dim dt As String
DateTime.DateFormat = "yyMMddHHmmss"
now = DateTime.Now
dt = DateTime.Date(now) ' e.g.: "110812150355" is Aug.12, 2011, 3:03:55 p.m.
Obj1.Target = Obj1.GetActivityBA
Obj1.Target = Obj1.GetField("vg")
bmp.InitializeMutable(Activity.Width, Activity.Height)
c.Initialize2(bmp)
Dim args(1) As Object
Dim types(1) As String
Obj2.Target = c
Obj2.Target = Obj2.GetField("canvas")
args(0) = Obj2.Target
types(0) = "android.graphics.Canvas"
Obj1.RunMethod4("draw", args, types)
Dim Out As OutputStream
Out = File.OpenOutput(File.DirRootExternal, dt & ".png", False)
bmp.WriteToStream(out, 100, "PNG")
Out.Close
End Sub

21.16 After compiling, where are the files

The compiler generates an *.apk file which is located in the 'Objects' folder. When the IDE is
connected to a device or to the Emulator the apk file is automaticaly uploaded to it.
The name of the apk file is the 'Application Label' you entered when you defined the project.
Example: GPSExample.apk
If you have checked 'Include Debug Information' and 'Attach Debugger' in the IDE you will get an
apk file with the _DEBUG suffix.
Example: GPSExample_DEBUG.apk
If you want to distribute your application you should uncheck these two options.
21 FAQ 334 Basic4Android Beginner's Guide

21.17 Run an application from another one

Erels' answer to the question:


You can start any application by sending the correct Intent.
The easiest way to see the required Intent is to look at the unfiltered logs while manually starting
the application.

The code below shows how to run an application from another one.
The PackageManager is an object in the Phone library.
The exact package name is needed !

21.18 How to pass an Array to a Sub

It is possible to pass Arrays, also multidimensional Arrays, to a sub.

Code example.

You need to specify the rank (number of dimensions) in the Sub definition with ',' .
If you want the Sub return an array you must also speccify it.

Returns a single string.

Returns a one rank string array.

Returns a two rank string array.


21 FAQ 335 Basic4Android Beginner's Guide

21.19 Getting language and country from device

You can get the currently language and country from a device with following code.

GetDefaultLanguage treturns a sting with the language and the country.

Needs the Reflection library (available only for users who baught Basic4Android) !

Examples:

 English (United States)


 Deutsch (Österreich)
 français (Suisse)
22 Glossary 336 Basic4Android Beginner's Guide

22 Glossary
Android Android is a software stack for mobile devices that includes an operating system,
middleware and key applications. Google Inc. purchased, in 2005, Android Inc. the company that
initially developed the software.

Java Java is a programming language originally developed by James Gosling at Sun


Microsystems (which is now a subsidiary of Oracle Corporation) and released in 1995 as a core
component of Sun Microsystems' Java platform. The language derives much of its syntax from C
and C++ but has a simpler object model and fewer low-level facilities.

Activity An activity is a single, focused thing that the user can do. Almost all activities
interact with the user, so the Activity class takes care of creating a window for you in which you
can place your UI.

View Provides classes that expose basic user interface classes that handle screen layout and
interaction with the user. Examples: Label, Panel, Button, EditText etc.

You might also like