1. *** New version of B4J is available ***
    B4J v7.8
    Dismiss Notice

B4A Library [Lib] BetterDialogs

Discussion in 'Additional libraries, classes and official updates' started by Informatix, Jul 4, 2013.

  1. Informatix

    Informatix Expert Licensed User

    I tried to improve the most useful dialogs of the Dialogs library. In my version, HTML tags are interpreted (even in the text of buttons), the InputBox uses a Masked EditText and has more options, you can check if the input is valid before closing the dialog, and the CustomDialog is fully customizable. I also solved an issue with the virtual keyboard.

    MsgBox (under Gingerbread and JellyBean):


    InputBox (under Gingerbread and JellyBean):


    CustomDialog (under Gingerbread and JellyBean):


    Another CustomDialog (under Gingerbread and JellyBean):


    - I added a CloseDialog function;
    - I added a margin parameter to the custom dialog.

    - I fixed a bug in InputBox when there's a default value;
    - I added the BackKeyPressed event for custom dialogs.

    - I added a PasswordMode option to the InputBox;
    - I added a CancelOnTouchOutside option.

    - I added a CursorPosition option to the InputBox.

    - I moved the CustomDialog parameters to the BD_CustomDlgParams class.
    - I added two new parameters: Duration and DialogGravity.
    - I removed the Margin parameter and added the MarginHeight parameter (to be used when Gravity is set to TOP).
    - The BodyWidth and BodyHeight parameters defines now accurately the size of the dialog body.

    - I added a "closing" event raised just before a custom dialog is dismissed. You can cancel the closure by returning False.

    - I added the "DlgResponse" parameter to the Closing event.

    This library does not work with Android versions < 2.
    It requires another library: Masked EditText

    Attached Files:

    Last edited: Apr 11, 2016
  2. tchart

    tchart Active Member Licensed User

    lumbanico likes this.
  3. drachmad

    drachmad Member Licensed User

    Hi Informatix, a nice lib, I like it.
    But I see it is still a modal-dialog, and according to the "experts" it is better to use a non-modal dialog in Android.
    Dialog class that already use a non-modal, e.g. AnotherDatePicker by Erel and ClsWheel v. 1.4 by Klaus. I don't think it is a difficult task to make a lib became a non-modal dialog.
    When I started b4a, I agree that modal dialog is easier to understand because it is like in VB.NET or alike.

    After trying a little bit, just an idea.
    Although I can make a variable and put the variable inside the BD.msgbox(...), it is nice if I can do like:
    Dim MB As BD_MessageBox
    MB.Title = "<B>M</B>essage <B>B</B>ox"
    MB.Message = "This<TT> message box </TT>can interpret the <Font Color=#A5A564>HTML</Font> tags.<BR/><H1>Nice!</H1>"
    MB.Icon = LoadDrawable("btn_rating_star_on_pressed")
    MB.Positive = "<B>Y</B>es"
    MB.Cancel = "<B>C</B>ancel"
    MB.Negative = "<B>N</B>o"
    Last edited: Jul 4, 2013
  4. Erel

    Erel Administrator Staff Member Licensed User

    Amazing work!

    Modal dialogs is a unique feature of Basic4android. You can use them as long as you understand their limitations (for example when you rotate the screen they will be dismissed).
    luke2012 likes this.
  5. Scantech

    Scantech Well-Known Member Licensed User

    Thank you. I will try this out. Would it be possible to add Non-Modal and list (Middle) in one of those dialogs with title (Top) and buttons (Bottom). Special use for listing all Bluetooth device in the list and at the bottom button used for "Scan for Device" or something else.
  6. rbsoft

    rbsoft Active Member Licensed User

    Beautiful. I will give it a try.
  7. Informatix

    Informatix Expert Licensed User

    Let me know whether the problem is solved. If not, could you post here a project to test? Because your screenshots don't tell me how you set up the dialog.
  8. Informatix

    Informatix Expert Licensed User

    Android has, natively, no modal dialog because such a dialog would stop the main thread for a time (until the user quits the dialog) and would raise an "Application not responding" error after a few seconds. But in some cases you really need a modal dialog (precisely when you want to stop the flow of your application and do not want any side effect due to the views in the background). Is there a convenient way to do that without a modal dialog? Not really.
    If you search in the StackOverflow forum (the main forum for Java users), you'll see that's a concern for a lot of people and has nothing to do with a nostalgy of VB.net (I developped on all kind of systems, with dozens of languages so I'm not plagued by the VB syndrom).
    As you may understand, creating a modal dialog is not easy because Android is not designed for it. Fortunately, Erel provided us with a solution that behaves well with the B4A message handler so it's harmless to create modal dialogs for B4A and not too complicated (but you have to use Java to write your library).
    A non-modal dialog is just a panel with a few views on it. Most B4A users are able to do that so I didn't feel the need to make a library with non-modal dialogs (that doesn't mean there's not a need).

    I don't think I will change that, so, yes, you should use variables.
    I didn't do that because I like to see quickly what a function do (by looking at the parameters). When a function has only one parameter grouping many settings, it is difficult at first glance to see what it does. There's no technical reason behind.
    Devan likes this.
  9. Informatix

    Informatix Expert Licensed User

    I won't do non-modal dialogs (see the post above).

    I'm not sure I will add new dialogs to the library because you can create most of them with my CustomDialog function. If you have troubles with ListView in the dialog, try to use my CheckList class.
  10. drachmad

    drachmad Member Licensed User

    Great job!!!

    Hi Informatix, thanks for your long explanation.
    Anyway, you do a great job!!!
  11. pwme

    pwme Member Licensed User

    Dialogs - default dimensions


    DB.CustomDialog("Filtro",-1,0dip, pnl,100%x,100%y, 0dip, Colors.RGB(0, 0, 0), "Chiudi", Null, Null, True)

    as you can see I' m passing 100%x, 100%y, but I see that you leave some default space around the dialog box. How many space do you leave?

    For example (2%x left,2% right, 6% top, 2% bottom)?

    Thank you in advance
  12. Informatix

    Informatix Expert Licensed User

    The OS uses a 9-patch drawable to display the dialog. This drawable has a padding, but I don't remember exactly its size. Personaly, I set the Margin parameter to 20dip and that seems to be good for all versions of the OS.

    Note for the custom dialog: DlgWidth+(2*Margin) should never exceed 100%x.
  13. urikupfer

    urikupfer Member Licensed User

    Hi Informatix
    Is there a way to use CustomDialog more than one's ,when the views declared in sub Globals ?, because in the second call there is an error massage:

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    at android.view.ViewGroup.addViewInner(ViewGroup.java:3339)
    at android.view.ViewGroup.addView(ViewGroup.java:3210)
    at android.view.ViewGroup.addView(ViewGroup.java:3155)
    at android.view.ViewGroup.addView(ViewGroup.java:3131)
    at flm.b4a.betterdialogs.BetterDialogs.CustomDialog(BetterDialogs.java:493)
    at flm.b4a.testdialogs.main._activity_resume(main.java:315)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:153)
    at flm.b4a.testdialogs.main.afterFirstLayout(main.java:95)
    at flm.b4a.testdialogs.main.access$100(main.java:16)
    at flm.b4a.testdialogs.main$WaitForLayout.run(main.java:74)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5041)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
  14. Informatix

    Informatix Expert Licensed User

    All is said in your log. Do yourPanel.RemoveView before displaying the dialog again.
  15. Mahares

    Mahares Well Known Member Licensed User

    @Frederic: Comme vos autres, cette librairie est superbe.
    I tried: <mark>Informatix</mark> to highlight a text, but it does not highlight it. Apparently it does not support HTML 5.0 tags that were not available in 4.1. Is that correct or don't I know what I am talking about?
  16. Informatix

    Informatix Expert Licensed User

  17. padvou

    padvou Active Member Licensed User

    Astonishing work as always!
  18. basil99

    basil99 Active Member Licensed User

    if i press "cancel" at inputbox, i got this

    LogCat connected to: B4A-Bridge: CCI Cosmo-355117042007297
    to B4A-Bridge (Bluetooth)
    sending message 
    to waiting queue (CallSubDelayed - UpdateStatus)
    PackageAdded: package:flm.b4a.testdialogs
    listening on: 159a04cc-f60c-4c14-89a8-c8f22bae9dfe
    Activity (main) Create, isFirst = true **
    Activity (main) Resume **
    main_activity_resume (B4A line: 
    Return r.RunMethod2("getDrawable", ID_Drawable, "java.lang.int")
    java.lang.NoSuchMethodError: flm.b4a.maskededittext.MaskedEditTextWrapper.getCompactText
       at flm.b4a.betterdialogs.BetterDialogs.InputBox(
       at flm.b4a.testdialogs.main._activity_resume(main.java:
       at java.lang.reflect.Method.invokeNative(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:
       at anywheresoftware.b4a.BA.raiseEvent2(BA.java:
       at anywheresoftware.b4a.BA.raiseEvent(BA.java:
       at flm.b4a.testdialogs.main.afterFirstLayout(main.java:
       at flm.b4a.testdialogs.main.access$
       at flm.b4a.testdialogs.main$WaitForLayout.run(main.java:
       at android.os.Handler.handleCallback(Handler.java:
       at android.os.Handler.dispatchMessage(Handler.java:
       at android.os.Looper.loop(Looper.java:
       at android.app.ActivityThread.main(ActivityThread.java:
       at java.lang.reflect.Method.invokeNative(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:
       at dalvik.system.NativeStart.main(Native Method)
    same with some text entered and Ok button.

    Android version 2.2

    Also I noticed Masked Edit text lib is not checked when i load the sample, but nothing change if i load it manually in libs tab
  19. Informatix

    Informatix Expert Licensed User

    Your version of Masked EditText is too old. You have to update it.
    It is used internally by BetterDialogs so it is required but doesn't appear as checked in your Libs tab (you check it if you want to use it in your application).
  20. basil99

    basil99 Active Member Licensed User

    Got it. Updated and all works fine now. Thanks!
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice