1

I guess I'll start by saying I am very new to B4A, and to programming in general. I have some very basic java and html exp. but that's it. I do not have any basic4ppc or really any IDE experience. Been using B4A for a few days now and can't get over the hump. Here are my noob questions:

  1. Does having many activities (20-30+) slow down the app? Is there a downside to having a lot of activities?
  2. I can't figure out how to scroll in the designer. I am trying to make a screen that has 25 buttons down in 1 column. However I can't scroll down to add more buttons below. I am able to add buttons programmically and in the fashion that I want (using a for loop), but is it normal to create views at runtime like this?
  3. How do you ensure your app looks the same across all devices? Tablets? I have a scroll view that fits perfect in the emulator, but on my phone (droid x), the bottom of the scroll view is not stretched to the bottom of the phone. I use the code: scvScreen1.Initialize(100%y). Is that not right?
  4. I have a Email screen in which is comprised of an edittext and a Send button, so that the users can send me questions from the app. However the Send button gives me this error on the 'URI =' line: "LastException java.lang.NumberFormatException: mailto:" here is the code:
    Sub btnSendEmail_Click
    Dim Uri As String
    Uri="mailto:me@gmail.com?subject=Test Email&body=" + edtHelpEmail.Text
    Dim Intent1 As Intent
    Intent1.Initialize(Intent1.ACTION_VIEW,Uri
    StartActivity(Intent1)
    End Sub
    Or is there another way to open the device's default email program?

  5. Regarding last question, how do I copy error messages to clipboard?? I selected the red error message on the bottom right of the IDE and tried ctrl-c, but didn't work.

  6. In B4A, what is a good method of storing persistent data? All I really need to store are some strings. Nothing fancy. These strings are to be stored locally. AI made this easy by using TinyDB.
  7. When using the designer, how do you ensure your views are centered on all devices? For instance, I have a screen that has several rows made up of: (label, edittext, label). And I want each row to be center aligned. Do I do this programmically? I'm thinking I would have to append each row of (label, edittext, label) to a panel, then in the code center the panel. Is this correct?

That's all I got for now, but I'm sure there will be plenty more questions later.

JonPM
  • 129
  • 1
  • 7
  • 1
    Welcome to StackOverflow! It might be better to ask each of these as separate questions. Otherwise, if someone gives a great answer to part 1, and a different person gives a great answer to part 2, et cetera, how will you decide whose answer to accept? – Jim Lewis Oct 26 '11 at 21:49

3 Answers3

1

1) The whole idea of android is to small components i.e. Apps working together, so no need to worry about opening lots of activities. Memory is very well managed behind the scenes in Android.

2) Sure. That sounds fine to me. Use the Layout designer as much as you can and then add the dynamic stuff later. It's all about striking a balance between the size of your code and the number of activities.

3) In the Designer there's an option called 'Send to UI Cloud'. This compares your app over multiple screen sizes. You can also scale your design and programmatically resize specific controls within your app in the Activity_Create Lifecycle

4) What you're doing is almost correct. I corrected your code:

Sub MailTo(StrAddress As String, StrSubject As String, StrBody As String)
    Dim StrMethod As String = "Sub MailTo(StrAddress As String, StrSubject As String, StrBody As String)"
    Try
        Dim StrUri As String
        StrUri = "mailto:" & StrAddress & "?subject=" & StrSubject & "&body=" & StrBody

        Dim Intent As Intent
        Intent.Initialize(Intent.ACTION_VIEW, StrUri)

        StartActivity(Intent)

    Catch
        If BlnLoudExceptions Then CdException.Show(StrClass, StrMethod, LastException)
    End Try
End Sub

I tend to have a code module called CdIntent.bas for these functions as it both keeps the project organised and makes it easier to implement the same functionality across projects.

Then to call you would use

CdIntent.MailTo("me@yes.no", "Subject!", "Body!")

5) I have a file called CdException.bas

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Show(StrClass As String, StrMethod As String, Ex As Exception)
    LogColor("Exception: " & Ex.Message & " - Class: " & StrClass & " - Method: " & StrMethod, Colors.Magenta)

End Sub

and then wrap functions in the following way:

Sub FunctionName(...Parameters...) as Int
    Dim StrMethod As String = "Sub Sleep(LngMilliseconds As Long)"
    Dim IntResult As Int = 0
    Try
        [code here inc. IntResult = ???]

    Catch
        If BlnLoudExceptions Then CdException.Show(StrClass, StrMethod, LastException)
    End Try
    Return IntResult
End Sub
  • BlnLoudExceptions is a global boolean that you'd declare in Process_Globals that you can switch on an off exception logs.
  • StrClass is a global String that you'd declare in Process_Globals that contains the name of the class e.g. "CdIntent.bas"

The exceptions then appear in magenta in the log screen along with the method name and class in which they occurred allowing you to home in on them.

6) I have a table in an SQLLite database called TabletSettings, which has two TEXT colums called 'Name' and 'Value'. It works well and gets you into a (what I think is a) good habit of always having a database available to your app from the get-go.

7) I'll get back to you on this as I haven't done this before. Until then, the following thread will help you in the B4A forum http://www.basic4ppc.com/android/forum/threads/convert-integer-to-dip.18800/

WonderWorker
  • 8,539
  • 4
  • 63
  • 74
0

I agree with Jim's point but will attempt to answer 1.

I'm new to android myself but as I understand it activities on the whole are only running when active. Unless you are using the app to continuously do something there is only one activity at a time. The number of activities is likely to affect the ram available more than anything. Lastly it might be worth walking first rather than running so to speak but trying a single and then add multiple activities.

Juncus
  • 11
  • 2
0
  1. You could try adding a ListView or ScrollView where the items are the buttons, this seems to be the std way of doing things otherwise a tabbed view.
Juncus
  • 11
  • 2