Edit 1.3
Table of contents
Getting started ......................................................................................................................... 6 1.1 Installing Basic4Android and Android SDK .................................................................... 6 1.1.1 Install and configure Basic4Android ........................................................................ 8 1.2 Installing Android Emulator............................................................................................. 9 2 My first program (MyFirstProgram.b4a)............................................................................... 13 3 Second program (SecondProgram.b4a) ................................................................................. 31 4 The IDE ................................................................................................................................ 44 4.1 Menu and Toolbar.......................................................................................................... 45 4.1.1 Toolbar .................................................................................................................. 45 4.1.2 File menu ............................................................................................................... 46 4.1.3 Edit menu............................................................................................................... 46 4.1.4 Project menu .......................................................................................................... 47 4.1.5 Tools menu ............................................................................................................ 48 4.2 Code area....................................................................................................................... 49 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 Undo Redo ............................................................................................. 49 Collapse a subroutine ............................................................................................. 49 Collapse the whole code......................................................................................... 50 Commenting and uncommenting code Bookmarks Indentation ...................................................... 51 .................................................................................. 51 ............................................................................................... 52
4.2.7 Autocomplete ................................................................................................. 54 4.2.8 Debugging ............................................................................................................. 56 4.2.9 Breakpoints............................................................................................................ 58 4.3 Tabs............................................................................................................................... 61 4.3.1 4.3.2 4.3.3 5 6 Module and subroutine lists Files Logs ............................................................... 61 ....................................................................................................... 62 ...................................................................................................... 63
4.3.4 Libs ........................................................................................................ 64 Screen sizes and resolutions................................................................................................... 65 The Emulator......................................................................................................................... 70 6.1 Launch an Emulator....................................................................................................... 70 6.2 Generate a new Emulator............................................................................................... 72 6.3 Emulator problems......................................................................................................... 74 7 B4A Bridge ........................................................................................................................... 75 8 The Designer ......................................................................................................................... 78 8.1 The menu....................................................................................................................... 79 8.1.1 File menu ............................................................................................................... 79 8.1.2 AddView menu ...................................................................................................... 79 8.1.3 The Tools menu ..................................................................................................... 80 8.2 Tools ............................................................................................................................. 81 8.2.1 Generate Members ................................................................................................. 81 8.2.2 BringTo Front ........................................................................................................ 82 8.2.3 Duplicate Selected View ........................................................................................ 82 8.2.4 Remove Selected View .......................................................................................... 83 8.2.5 Change grid............................................................................................................ 83 8.2.6 Connect device or emulator.................................................................................... 84 8.3 General settings ............................................................................................................. 84 8.4 Image files ..................................................................................................................... 85 8.5 Parameter list ................................................................................................................. 86
Table of contents
8.6 Layout variants .............................................................................................................. 88 9 Process and Activity life cycle............................................................................................... 93 10 Variables and objects......................................................................................................... 97 10.1 Variable Types............................................................................................................... 97 10.2 Names of variables ........................................................................................................ 98 10.3 Declaring variables ........................................................................................................ 98 10.3.1 Simple variables..................................................................................................... 98 10.3.2 Array variables....................................................................................................... 99 10.3.3 Type variables...................................................................................................... 101 10.4 Casting ........................................................................................................................ 102 10.5 Scope........................................................................................................................... 103 10.5.1 Process variables.................................................................................................. 103 10.5.2 Activity variables ................................................................................................. 103 10.5.3 Local variables..................................................................................................... 103 10.6 Tips ............................................................................................................................. 104 11 Modules........................................................................................................................... 105 11.1 Activity modules.......................................................................................................... 106 11.2 Code modules .............................................................................................................. 107 11.3 Service modules........................................................................................................... 108 12 Example programs........................................................................................................... 109 12.1 User interfaces ............................................................................................................. 109 12.1.1 Menu example (UserInterfaceMenu.b4a)............................................................. 110 12.1.2 TabHost example (UserInterfaceTabHost.b4a) ................................................... 111 12.1.3 Button toolbox example (UserInterfaceButtonToolbox.b4a)................................ 112 12.2 Program with 3 Activities (ThreeActivityExample.b4a) .............................................. 113 12.3 ScrollView examples ................................................................................................... 120 12.3.1 ScrollView example program............................................................................... 121 12.4 Data base example ....................................................................................................... 132 12.4.1 Database basics .................................................................................................... 132 12.4.2 Database example program .................................................................................. 135 13 Basic language................................................................................................................. 149 13.1 Program flow ............................................................................................................... 149 13.1.1 Prorogress_Globals routine .................................................................................. 149 13.1.2 Globals routine..................................................................................................... 150 13.1.3 Activity_Create (FirstTime As Boolean) routine .................................................. 150 13.1.4 Activity_Resume routine...................................................................................... 150 13.1.5 Activity_Pause (UserClosed As Boolean) routine................................................. 150 13.2 Expressions.................................................................................................................. 152 13.2.1 Mathematical expressions .................................................................................... 152 13.2.2 Relational expressions.......................................................................................... 153 13.2.3 Boolean expressions............................................................................................. 153 13.3 Conditional statements................................................................................................. 153 13.3.1 If Then End If................................................................................................. 154 13.3.2 Select Case........................................................................................................ 155 13.4 Loop structures ............................................................................................................ 157 13.4.1 For Next............................................................................................................ 157 13.4.2 Do - Loop ............................................................................................................ 158 13.5 Subs............................................................................................................................. 159 13.5.1 Declaring ............................................................................................................. 159 13.5.2 Calling a Sub........................................................................................................ 159 13.5.3 Naming ................................................................................................................ 159 13.5.4 Parameters ........................................................................................................... 160 13.5.5 Returned value ..................................................................................................... 160
Table of contents
13.6 Libraries ...................................................................................................................... 161 13.6.1 Standard libraries ................................................................................................. 161 13.6.2 Additional libraries folder .................................................................................... 161 13.6.3 Error message "Are you missing a library reference?" .......................................... 162 13.7 String manipulation ..................................................................................................... 163 13.8 Timers ......................................................................................................................... 164 14 Graphics / Drawing.......................................................................................................... 165 14.1 Overview ..................................................................................................................... 165 14.2 Drawing test programs ................................................................................................. 167 14.2.1 Drawing rotating bitmaps / RotatingNeedle.......................................................... 167 14.2.2 Simple draw functions.......................................................................................... 172 15 B4A Keywords ................................................................................................................ 181 15.1 Bit ............................................................................................................................... 181 15.2 DateTime..................................................................................................................... 182 15.3 Exception..................................................................................................................... 185 15.4 Keywords .................................................................................................................... 186 15.5 LayoutValues............................................................................................................... 198 15.6 String........................................................................................................................... 199 15.7 StringBuilder ............................................................................................................... 201 15.8 Timer........................................................................................................................... 203 16 Views .............................................................................................................................. 205 16.1 Activity........................................................................................................................ 205 16.2 Button.......................................................................................................................... 209 16.3 CheckBox.................................................................................................................... 212 16.4 EditText....................................................................................................................... 215 16.5 ImageView .................................................................................................................. 220 16.6 Label ........................................................................................................................... 223 16.7 ListView...................................................................................................................... 226 16.8 Panel............................................................................................................................ 231 16.9 ProgressBar ................................................................................................................. 234 16.10 RadioButton............................................................................................................. 236 16.11 ScrollView............................................................................................................... 239 16.12 SeekBar ................................................................................................................... 242 16.13 Spinner .................................................................................................................... 245 16.14 TabHost ................................................................................................................... 249 16.15 ToggleButton........................................................................................................... 253 16.16 View ........................................................................................................................ 256 16.17 WebView................................................................................................................. 258 17 VB6 versus B4A.............................................................................................................. 262 18 FAQ ................................................................................................................................ 267 18.1 "Please save project first" message............................................................................. 267 18.2 "Are you missing a library reference" message........................................................... 267 18.3 How loading / updating a library.................................................................................. 268 18.4 When do we need to 'Initialize' and when not............................................................. 268 18.5 Split a long line into two or more lines......................................................................... 269 18.6 Avoid closing an application........................................................................................ 269 18.7 Unwanted events like Click, Touch or others ............................................................... 270 18.8 Adding a Menu item .................................................................................................... 270 18.9 How do I remove a View with the Designer................................................................. 271 18.10 "Process has timeout" message............................................................................... 271 18.11 Getting a picture from the gallery............................................................................. 272 19 Glossary .......................................................................................................................... 273
Table of contents
1 Getting started
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
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. If for some reason, you don't see the red Continue button try to switch to a different browser. - On the next page, you should press on the file link:
1 Getting started
Next step is to install the Android SDK and a platform - Download Android SDK. - 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. - When the application opens, it will show a page with all the available packages. Press the "Cancel" button, as you do not need to install all the platforms. - Choose "Available Packages" and choose "SDK Platform 2.2, API 8". It should appear under the "Android repository" node. The file structure of API 9 is different. For now, you should use API 8.
Note that you can install more packages later. - Press on Install Selected and install both packages.
1 Getting started
- 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).
1.2
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 AVD Manager should appear:
- Click on
10
- 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).
11
- Click on
- You will see several windows popping up and disappearing. This is fine. - The emulator should boot up:
Wait... on the first time it can take several minutes until the emulator is ready.
12
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.
2 My first program
13
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
14
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.
15
Click on
Wait until the Emulator is ready, this will take quite some time.
2 My first program
16
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:
2 My first program
17
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
18
We have now:
main module name of the view type of the view, Label, this parameter can't of course be changed name of the routine that handles the events of the Label parent view the Label belongs to.
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
19
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
20
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
21
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.
2 My first program
22
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:
Text Size
to 24.
2 My first program
23
Let us add the last Label for the comments, position it below the Button and resize it.
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.
24
Click on
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
25
The Generate Members tool allows to automatically generate references and subroutine frames.
Click on
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
Click on
26
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.
27
- 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.
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
28
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.
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
29
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
Click on
These two parameters can also be changed in the IDE in the Project menu.
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
30
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
31
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. .
3 Second program
32
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
Duplicate it
3 Second program
33
Move it between the upper labels and the button and resize it.
Text
Text Color
to Black
3 Second program
34
Change its name to pnlKeyboard "pnl" for Panel, the view type.
to 0
3 Second program
35
We will move the O K button from the Activity to the pnlKeyboard Panel.
Click on
Move Label lblComments up near Label lblResult and increase the height of Panel pnlKeyboard like in the image.
3 Second program
36
to 10 to 120 to 55 to 55 to 0 to 0
Size
to 24
Click on GradientDrawable
3 Second program
37
Change the following parameters. Orientation to TOP_BOTTOM First Color Second Color
Pressed Drawable
to GradientDrawable
Let us duplicate btn0 and position it besides button btn0. Change following parameters. Name to btn1
Tag Text
to 1 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
38
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
39
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 Find(F3)
3 Second program
40
Click on
Click on
and
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. 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 Case "BS" Case Else
sets the variable to test. checks if it is the button with the "BS" tag value. handles all the other buttons.
3 Second program
41
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.
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
SubString2(BeginIndex, EndIndex) extracts a new string beginning at BeginIndex (inclusive) until EndIndex (exclucive). Now the whole routine is finished.
3 Second program
42
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.
3 Second program
43
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
44
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
45
4.1
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
46
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.
Cuts the selected text and copies it to the clipboard. Cuts the line at the cursor position. Copies the selected text 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.
Block Comment Sets the selected lines as comments. Block Uncomment Uncomments the selected lines. Remove All Bookmarks Remove All Breakpoints Outlining Bookmarks. Breakpoints.
4 The IDE
47
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.
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
48
IDE Options
see below
Clean Files see below Clean Project see below Run AVD Manager Configure Paths
Change Tab size. Change Font., not recommended. Word wrap, see below. Auto Save, see below. Show Tooltips, see below.
Word wrap Without word wrap. The end of the line is hidden.
Auto Save Saves the program when you run it. Show Tooltips During Typing
49
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.
Hovering with the mouse over the collapsed routine name shows its content.
50
In the Edit menu there are two functions allowing collapsing or expanding the whole code.
Hovering with the mouse over a subroutine still shows the beginning of its content.
51
Original code
Lines set as comments. To set the lines to normal. Select the lines and click on .
4.2.5 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 Click on to jump forward to the next bookmark. to jump backward to the previous bookmark. .
In the
52
4.2.6 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.
53
Original code
The whole block has moved one tabulation to the right. To move a block to the left. Select the code and click on .
54
4.2.7 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.
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.
55
A second Autocomplete function allows you to create event subroutines. Enter the Sub word plus a blank character.
Press Tab.
The subroutine frame is generated. Modify 'EventName' to the EventName of the button, 'bntOK' in our case.
56
4.2.8 Debugging
To allow debugging you must activate the Debugger option.
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 The two major utilities for debugging are:
57
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.
58
4.2.9 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.
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.
59
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
Hovering with the mouse over a view shows its parameters like in the list.
4 The IDE / 4.2 Code area Let us run the program step by step:
60
Values of the two numbers in the Global variables window, it has been reduced to just show the two numbers.
61
4.3
Tabs
There are 4 tabs at the bottom right corner of the IDE that displays the followin information.
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.
62
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.
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. In the IDE, in the bottom right corner.
63
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
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.
64
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.
65
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 3.6 3.6 3.9 3.6 7.2 10 Resolution 320 / 480 480 / 720 480 / 800 240 / 320 640 / 960 720 / 1280 Density 160 240 240 120 160 160 Scale 1 1.5 1.5 0.75 1 1 W / H Ratio 3/2 3/2 5/3 4/3 3/2 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 It is possible to generate special Emulators with special sizes, resolutions and densities.
66
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 resolution 240 / 320 320 / 480 480 / 800 Density 120 160 240 H / W ratio 3/2 4/3 5/3 Height pixels 360 480 720 Pixel diff. - 40 0 + 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.
67
Tests with the three Emulators with different resolutions and different densities.
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 Second test with lines 23 and 24 activated.
68
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.
69
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.
6 The Emulator
70
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
71
Wait until the Emulator is ready, this will take quite some time.
6 The Emulator
72
6.2
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.
Click on
Click on
6 The Emulator
73
Click on
Click on
6 The Emulator
74
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
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 timeout value in the b4aV0.1.ini file. The file is located in: XP: C:\Documents and Settings\<user>\Application Data\Anywhere Software\Basic4android Vista / 7: C:\Users\<user>\AppData\Roaming\Anywhere Software\Basic4android and set the ProcessesTimeoutSeconds parameter to a higher value. I set it to 45 seconds : ProcessesTimeoutSeconds=45.
7 B4A Bridge
75
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 B4ABridge 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:
7 B4A Bridge
76
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
77
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
78
The Designer
The Designer allows generating layouts with either the Emulator or a real device.
79
8.1
The menu
Opens a new empty layout. Opens an existing layout. Saves the current layout. Saves the current layout with a new name. Layout file list, in this case only one file, 'Main'.
This menu allows you to select the view you want to add on the current layout on the device or the Emulator.
Button CheckBox EditText ImageView Label ListView Panel ProgressBar RadioButton ScrollView SeekBar Spinner TabHost ToggleButton WebView
adds a Button adds a CheckBox adds an EditText adds an ImageView adds a Label adds a ListView adds a Panel adds a ProgressBar adds a RadioButton adds a Scrollview adds a SeekBar adds a Spinner adds a TabHost adds a ToggleButton adds a WebView
80
Members generator Brings the selected View to front Duplicates the selected View Removes the selected View
Duplicate Selected View Remove Selected View Change Grid Connect Disconnect
Allows to change the grid size Connects the Emulator or the device Disconnects the Emulator or the device
81
8.2
Tools
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
Click on
82
Click on the view you want to duplicate to select it. Click on to duplicate the view.
83
The view has been removed. Note: Be careful, you will not be asked if you really want to remove the view.
Click on
You can change the grid size to the value you want.
84
If different devices or Emulators are connected, you will be asked what device or Emulator you want to connect.
Click on
to confirm.
8.3
General settings
Shows the Designer state, in this case the Designer is connected.
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.
85
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 .
86
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.
87
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 View, in pixels. Top View, in pixels. Width Height Enabled Visible X coordinate of the left edge of the View from the left edge of its parent
Y coordinate of the upper edge of the View from the upper edge of its parent
Width of the View in pixels. Height of the View in pixels. Enables or disables the use of the View Ex: Enabled = True 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.
88
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.
89
Click on .
90
The Toolbox is now visible. We need to write code to automatically rearrange the views when landscape mode is used.
91
to
Click on Ctrl + F11 to change to portrait >>> We now have two layout variants in the same layout file.
92
We can achieve a similar effect in the Designer when a different Layout Variant is selected and we switch to Landscape mode (Ctrl-F11).
93
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).
94
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.
95
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.
96
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).
97
-2 1.4E-45 - 2 -1074
2.2250738585072014 E 308
-149
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.
98
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:
99
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.
The last index is equal to the number of items in each dimension minus 1.
LastName(49), Matrix(2,2), Data(2,4,9)
100
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.
101
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.
102
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.
103
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.
104
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:
11 Modules
105
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
106
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
107
11 Modules
108
12 Example programs
109
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 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
110
Each page is on a Panel, pnlPage1, pnlPage2 and pnlPage3. The Panels are added by code. The page layout files are loaded to the Panels. The Menu items are added to the Activity. One Click event routine for each Menu item. It could also be done in one routine (like in UserInterfaceButtonToolbox.b4a).
12 Example programs
111
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
112
Each page is on a Panel, pnlPage1, pnlPage2 and pnlPage3. The Panels are added by code. The page layout files are loaded to the Panels. The Buttons are in the Main layout on the pnlToolBox panel. One Click event routine for all Buttons.
113
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.
114
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.
12.2 Three Activity example program Modify the code of Page2 module as below:
115
Add now a new module "Page3" the same way as Page2 and modify the code like below:
12.2 Three Activity example program Let us modify the code of the Main module:
116
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.
117
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.
118
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=.
119
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
Similar for Page 2 and Page 3. The layout files are in the project.
120
SQLLiteDB
ScrollView, layouts
Add imageview
HelpScrollView
121
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.
122
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) MoveLeft0 MoveX0 MoveX1 DeltaScroll DeltaX Time0
Define a custom variable that contains a row and a column index. Used for the horizontal scrolling. Used for the horizontal scrolling. Used for the horizontal scrolling. Used for the horizontal scrolling. Used for the horizontal scrolling. 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.
123
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.
124
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.
125
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).
126
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
127
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'.
128
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.
129
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.
130
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
131
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.
132
133
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 INTERNAL PRIMARY KEY, Col1 TEXT, Col2 FLOAT")
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")
The whole database and ordering according to a given column: SELECT * FROM TableName ORDER BY Col1 ASC SELECT * FROM TableName ORDER BY 2 DSC
ascending descending
The column to order can be given either by its name Col1 or its number 2. The column numbering begins with 1.
134
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, in the examples the max and min values of the given column. SELECT Col1 FROM Tablename WHERE ID = idVal
Cursor1 = SQL1.ExecuteQuery("SELECT Col1 FROM TableName WHERE ID = idVal")
Max / min value in a 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")
135
Database view
Edit view
Filter view
12.4 Database example program What we can do: Ordering according to a given column
136
Clicking on a header sorts the database accoring to this column in ASC ascending mode. Default or click on Click on
137
Click on
Click 0n
Long click on
Click on
138
A click on
A long click on
or
What can be done: Enter different filtering parameters. For example: - FirstName John - City Lon%
There does exist only one person with a first name John and living in a city beginning with Lon% (London in our example).
139
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.
12.4.2.3
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
140
- First reference the SQL library in the tab in the lower right corner in the IDE.
- Define o the file name : o the directory name : o the table name : - Declare other variables.
persons.db File.DirInternal (File.DirRootExternal) persons
the index of the column to sort a flag, if the filter function is active or not the filter type string, can be either AND or OR an array of strings with the sort direction for each column ASC or DSC
141
- 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.
142
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
143
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.
144
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'
145
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')
If there is at least one value missing we display an error message and leave the routine.
146
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 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.
147
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..
148
Focus change in the EditText views of the Edit View or the Filter View.
We check if the EdutText 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.
13 Basic language
149
13 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 nonscience 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).
The program goes through following routines when starting from top to down:
13 Basic language
150
151
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.
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.
13 Basic language
152
13.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).
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 + 5) * (3 + 2) = 45 (4 + 5)2 * (3 + 2) = 405 Power(4+5,2)*(3+2) 11 Mod 4 = 3 233 Power(23,3) - 22 = - 4 (-2)2 = 4 > 4 + 15 + 2 > 9*5 > 92 * 5 > 81 * 5
13 Basic language
153
Used to test the equivalence of two values the negated equivalence of two values if the value of the left expression is greater than that of the right if the value of the left expression is less than that of the right if the value of the left expression is greater than or equal to that of the right if the value of the left expression is less than or equal to that of the right
13 Basic language
154
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 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 Else If
VB ElseIf
13 Basic language
155
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:
13 Basic language
156
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.
13 Basic language
157
The ForNext 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
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.
158
In VB the increment character is added after the Next Keyword. In VB the loop type is specified after the Exit keyword.
13.4.2 Do - Loop
Several configurations do exist:
test is any expression Executes the code while 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.
Examples:
VB Exit Loop
In VB the loop type is specified after the Exit keyword. VB accepts also following loops, which are not supported inB4A.
13 Basic language
159
13.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.
13.5.1 Declaring
A Sub is declared in the following way:
It starts with the keyword Sub, followed by the Subs 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.
Value returned by the Sub. Sub name. Capital value transmitted to the Sub. Rate value transmitted to the Sub.
13.5.3 Naming
Basically, you can name a Sub any name thats 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.
13 Basic language
160
13.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.
13 Basic language
161
13.6 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.
13 Basic language
162
If you setup a special additional libraries folder you must specify it in the IDE. In the menu Tools / Configure Paths:
13 Basic language
163
13 Basic language
164
13.8 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
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.
14 Graphics / Drawing
165
14 Graphics / Drawing
14.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.
14 Graphics / Drawing
166
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)
14 Graphics / Drawing
167
o starts rotating
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.
168
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
14 Graphics / Drawing
169
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
170
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.
171
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.
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.
14 Graphics / Drawing
172
You can play with the buttons to show the different combinations of visible and hidden layers.
14 Graphics / Drawing
173
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).
14 Graphics / Drawing
174
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.
14 Graphics / Drawing
175
Touching the screen with the finger and moving it, moves the blue and transparent circles.
176
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
14 Graphics / Drawing
177
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.
178
draw the layout(0) background dark gray. draw the layout(1) and layout(2) background transparent.
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).
14 Graphics / Drawing
179
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.
14 Graphics / Drawing
180
Looking closer on the displayed texts we see the reference point for each text.
LEFT
alignment.
CENTER alignment.
RIGHT
alignment.
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.
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.
15 B4A Keywords
181
15 B4A Keywords
List of types: Bit DateTime Exception Keywords LayoutValues String StringBuilder Timer
15.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 Returns the bitwise AND of the two values.
182
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.
15.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.
15 B4A Keywords
183
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:
15 B4A Keywords
184
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
15 B4A Keywords
185
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.
15.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
15 B4A Keywords Events: None Members: IsInitialized As Boolean Message As String [read only] Members description: IsInitialized As Boolean Message As String [read only]
186
15.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
15 B4A Keywords
187
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
188
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
15 B4A Keywords
189
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.
15 B4A Keywords 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.
190
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
15 B4A Keywords
191
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.
192
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.
15 B4A Keywords
193
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:
15 B4A Keywords
194
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"
15 B4A Keywords
195
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).
196
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.
15 B4A Keywords Sqrt (Value As Double) As Double Returns the positive square root. StartActivity (Activity As Object)
197
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
198
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
15.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
15 B4A Keywords
199
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).
15.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
15 B4A Keywords
200
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
15 B4A Keywords
201
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.
15.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
15 B4A Keywords
202
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
15 B4A Keywords
203
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.
15.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.
15 B4A Keywords
204
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.
16 Views
205
16 Views
List of types: Activity Button CheckBox EditText ImageView Label ListView Panel ProgressBar RadioButton ScrollView SeekBar Spinner TabHost ToggleButton View WebView
16.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
206
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
16 Views
207
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"))
208
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
16 Views
209
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.
16.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:
210
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
16 Views
211
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
16 Views Tries to set the focus to this view. Returns True if the focus was set. SendToBack
212
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.
16.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]
16 Views Enabled As Boolean Gravity As Int Height As Int Initialize (EventName As String) Invalidate
213
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.
214
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
16 Views
215
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.
16.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]
16 Views
216
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
16 Views
217
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
16 Views
218
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.
16 Views 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
219
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
16 Views
220
16.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
221
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
16 Views
222
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.
16 Views
223
16.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
16 Views
224
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
16 Views 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
225
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.
16 Views
226
16.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)
16 Views
227
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
16 Views
228
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.
16 Views Clear Clears all items from the list. Color As Int [write only]
229
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
16 Views Tries to set the focus to this view. Returns True if the focus was set.
230
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
16 Views Visible As Boolean Width As Int Gets or sets the view's width.
231
16.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)
16 Views
232
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.
233
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
16 Views
234
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.
16.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
16 Views SendToBack
235
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
16 Views 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
236
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.
16.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
16 Views BringToFront Checked As Boolean Color As Int [write only] Enabled As Boolean Gravity As Int Height As Int Initialize (EventName As String) Invalidate
237
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:
16 Views
238
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.
16 Views
239
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.
16.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:
240
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:
16 Views
241
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(...)
16 Views 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
242
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.
16.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]
243
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.
244
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
16 Views Gets or sets the current value. Visible As Boolean Width As Int Gets or sets the view's width.
245
16.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)
16 Views
246
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.
247
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
16 Views Tries to set the focus to this view. Returns True if the focus was set. SelectedIndex As Int
248
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.
16 Views
249
16.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
250
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.
16 Views
251
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)
16 Views
252
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.
16 Views
253
16.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)
16 Views
254
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)
16 Views
255
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.
16 Views
256
16.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
257
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.
16 Views SendToBack
258
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.
16.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
16 Views BringToFront Color As Int [write only] Enabled As Boolean Forward Height As Int Initialize (EventName As String) Invalidate
259
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:
260
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)
16 Views
261
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.
262
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 --For i = 1 to 6 If i = 4 Then ...code... End If Next Select Case [expr] Colors: -----Continue [Skips to Next in For-Next loop] For i = 1 to 6 If i = 4 Then Continue ...code... ... Next Select [value]
263
L1.BackColor = vbRed L1.ForeColor = vbBlack Calling a sub: ------------SubName x, y Sub SubName() be you L1.Color = Colors.Red L1.TextColor = Colors.Black
SubName(x, y) Sub SubName() As Int/String/etc. -- a Global variable cannot a parameter, so say that "player" is a Global variable, cannot say: PlayCard(player). Instead you have to say: i=player: PlayCard(i)
Sub FName() 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)" Return Return [value]
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 in a Do Loop with DoEvents in it, WebView could not be
while 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() InputBox($) NumberFormat & NumberFormat2 [see documentation] 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", "title") MsgBox2(Message, Title, Positive, Cancel, Negative, Icon) as 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")
264
--Rnd is < 1 Round(n)
ToastMessageShow(text, b) [where b=True for long duration] Rnd(min, max) is integer >= min to < max same, or Round2(n, x) where x=number of decimal places
i = Val(string) string is
If IsNumber(string) Then i = string Else i = 0 -An attempt to use i=string "throws an exception" if the not numbers.
control.SetFocus n / 0 : error
view.RequestFocus 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 1-70 t = DateTime.Now ' Ticks are number of milliseconds since 1-
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 Constants: --------"" vbCr vbCrLf
String "Members": ---------------VB6 uses a character position pointer starting with 1. B4A uses a character Index pointer starting with 0. VB6 Mid$("abcde", Mid$("abcde", Mid$("abcde", Mid$("abcde", Mid$("abcde", VB6 === Mid$(text, Mid$(text, Mid$(text, position] Mid$(text, B4A array array array array array
1, 2, 3, 4, 5,
1) 1) 1) 1) 1)
= = = = =
= = = = =
0 -- "a" = "abcde".CharAt(0) 1 2 3 4
B4A === text.CharAt(n-1) text.SubString(n-1) text.SubString2(n-1, n+x-1) [n+x-1=end text = text.SubString2(0, n-2) & _
265
Left$(text, n) [n=num.of chars.] Right$(text, n) If a$ = b$... If Right$(text, n) = text2... If Left$(text, n) = text2... If Lcase$(text) = Lcase$(text2)... x = Len(text) text = Replace(text, str, str2) Lcase(text) Ucase(text) Trim(text) (no LTrim or RTrim in B4A) Instr(text, string) Instr(int, text, string)
text2.SubString2(0, x-1) & _ text.SubString(n-1 + z) where... z = Min(x, text2.length) text.SubString2(0, n) text.SubString(text.Length - n + 1) If a.CompareTo(b)... If text.EndsWith(text2)... If text.StartsWith(text2)... If text.EqualsIgnoreCase(text2)... x = text.Length text.Replace(str, str2) text.ToLowerCase text.ToUpperCase text.Trim text.IndexOf(string) text.IndexOf2(string, int) Returns -1 if not found. Returns char. index, not position. Starts search at "int". If x.EqualsIgnoreCase(y)... text.Insert(n, s) same
If Lcase$(x) = Lcase$(y)... text = Left$(text, n) & s & Right$(Text, y) Asc(s) [where s = a character]
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.
266
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.
18 FAQ
267
18 FAQ
Some of the chapters below have been picked up in in the forum.
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.
18 FAQ
268
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.
18 FAQ
269
Becomes:
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 yes we return False to resume the event o If no we return True to transmit the event to the OS.
means split the line and put the rest on the next line.
18 FAQ
270
Examples:
or
18 FAQ
271
18 FAQ
272
19 Glossary
273
19 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.