Beta Can we use ba.raiseEvent from inline java code?

Discussion in 'Android Questions' started by stevel05, Feb 2, 2015.

  1. stevel05

    stevel05 Expert Licensed User

    Is it possible to use ba.raiseEvent to call a callback sub in the enclosing Activity,class,service or code module? It doesn't give an error, just no result either.

    In a class, I've tried:

    Code:
    Sub DoMultiply
        nativeMe.RunMethod(
    "Multiply"Array ("logresult",10))
    End Sub

    Sub LogResult(Result As Int)
        
    Log(Result)
    End Sub

    #If JAVA
    private int mm = 100;
    public void Multiply(String EventName,int i) {
        int result = i * 2 + mm;
        if(ba.subExists(EventName)){
            BA.Log("Found");
            ba.raiseEvent(this,EventName.toLowerCase(),result);
        } else {
            BA.Log("Not Found");
        }
    }
    #End If
    The sub is found, but not called. result is an int and the target sub has one parameter which is an Int.

    I can get the result I want by using conditional compilation and two subs that call the target sub directly with different signatures for Debug and Release modes. But I am hoping for a simple alternative.

    Thanks
     
  2. thedesolatesoul

    thedesolatesoul Expert Licensed User

    Wouldnt ba.callsub (or similar) be more appropriate?
     
  3. warwound

    warwound Expert Licensed User

    I don't see where the ba variable has been declared or set?
     
  4. stevel05

    stevel05 Expert Licensed User

    I can't see a ba.callsub available, just checked the B4aShared from the Beta version with eclipse. Have I missed it?

    The ba variable will be declared and set within the B4a class code (I think). It's definitely there and responding.
     
  5. thedesolatesoul

    thedesolatesoul Expert Licensed User

    Yeah, now I do feel ridiculous about this:
    Code:
    anywheresoftware.b4a.keywords.Common.CallSubNew(mostCurrent.activityBA,main.getObject(),"Test");
     
  6. stevel05

    stevel05 Expert Licensed User

    Yep, that works. Thanks

    Code:
    anywheresoftware.b4a.keywords.Common.CallSubNew2(ba,this,"logresult",result);
    I'm going to have to do some more digging :)
     
    DonManfred likes this.
  7. Erel

    Erel Administrator Staff Member Licensed User

    Raising an event from a class (this code will not work in other types of modules):

    Code:
    Sub Class_Globals
       
    Private nativeMe As JavaObject
    End Sub

    Public Sub Initialize
       nativeMe = Me
       nativeMe.RunMethod(
    "MethodThatRaiseEvent"Array("MyEvent"))
    End Sub

    Private Sub MyEvent_Fire(Value As Int)
       
    Log($"Fire: ${Value}"$)
    End Sub

    #If JAVA
    import anywheresoftware.b4a.keywords.Common;
    public void MethodThatRaiseEvent(String EventName) {
       Common.Log("use imports to make your code more readable!");
       ba.raiseEventFromUI(this, EventName.toLowerCase(BA.cul) + "_fire", 10);
    }
    #End If
    1. Remember that the event string must be lower cased.
    2. Use raiseEventFromUI instead of raiseEvent. Otherwise you will get a warning in rapid debug mode.
    3. It is important that the event subs will be made of two parts separated with underscore. This is the convention in B4X and it will also work in obfuscated mode.
     
  8. Erwin Andersen

    Erwin Andersen Member Licensed User

    when I try to compile, raise an error like this :

    upload_2015-8-24_11-49-59.png
     
  9. Erel

    Erel Administrator Staff Member Licensed User

    Can you post your code?
     
  10. Erwin Andersen

    Erwin Andersen Member Licensed User

    The code shown below :

    #Region Project Attributes
    #ApplicationLabel: Inline Java
    #VersionCode: 1
    #VersionName: Test
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #End Region

    #Region Activity Attributes
    #FullScreen: True
    #IncludeTitle: True
    #End Region

    #Region Library Tambahan
    #AdditionalJar : classes.jar
    #AdditionalJar : gson-2.3.1.jar
    #End Region

    Sub Process_Globals
    Private nativeMe As JavaObject
    End Sub

    Sub Globals
    End Sub

    Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
    nativeMe.InitializeContext
    End If

    nativeMe.RunMethod("VTGetToken", Array("DataToken", False))
    End Sub

    Sub Activity_Resume
    End Sub

    Sub Activity_Pause (UserClosed As Boolean)
    End Sub

    Sub DataToken_Hasil(IsiToken As String)
    Log(IsiToken)
    End Sub

    #If JAVA
    import android.view.*;
    import id.co.veritrans.android.api.VTDirect;
    import id.co.veritrans.android.api.VTInterface.ITokenCallback;
    import id.co.veritrans.android.api.VTModel.VTCardDetails;
    import id.co.veritrans.android.api.VTModel.VTToken;
    import id.co.veritrans.android.api.VTUtil.VTConfig;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.util.Log;
    import com.google.gson.Gson;
    import anywheresoftware.b4a.BA;
    import anywheresoftware.b4a.objects.ViewWrapper;

    public void VTGetToken(String EventName, boolean aman)
    {
    VTDirect vtDirect = new VTDirect();
    VTConfig.VT_IsProduction = false;
    VTConfig.CLIENT_KEY = "VT-client-mMP4410Ig1HRMb6l";
    VTCardDetails cardDetails = null;

    cardDetails = CardFactory(aman);
    vtDirect.setCard_details(cardDetails);

    vtDirect.getToken(new ITokenCallback()
    {
    public void onSuccess(VTToken token)
    {
    BA.Log(token.getToken_id());
    BA.Log(token.getBank());
    BA.Log(Integer.toString(token.getStatus_code()));
    BA.Log(token.getStatus_message());
    BA.Log(token.getRedirect_url());

    ProsesBalikan(EventName, token.getToken_id());
    }

    public void onError(Exception e)
    {
    mymsgbox("Error", e.getMessage());
    ProsesBalikan(EventName, "Error");
    }
    });

    }

    private void ProsesBalikan(String Nama, String IsiToken)
    {
    BA.Log("Isi data : " + IsiToken);
    pBA.raiseEventFromUI(this, Nama.toLowerCase(BA.cul) + "_hasil", IsiToken);
    }

    private void mymsgbox(String str, String str2)
    {
    AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);
    dlgAlert.setTitle(str);
    dlgAlert.setInverseBackgroundForced(false);
    dlgAlert.setMessage(str2);

    dlgAlert.setPositiveButton("OK", new DialogInterface.OnClickListener()
    {
    public void onClick(DialogInterface dialog, int whichButton)
    {
    BA.Log("Tombol OK");
    }
    });

    dlgAlert.setCancelable(true);
    dlgAlert.create().show();
    }

    private VTCardDetails CardFactory(boolean secure)
    {
    VTCardDetails cardDetails = new VTCardDetails();
    cardDetails.setCard_number("4811111111111114");
    cardDetails.setCard_cvv("123");
    cardDetails.setCard_exp_month(1);
    cardDetails.setCard_exp_year(2020);
    cardDetails.setSecure(secure);
    cardDetails.setGross_amount("1000000");

    return cardDetails;
    }

    #End IF
     
  11. DonManfred

    DonManfred Expert Licensed User

    use code tags when posting code here!

    Or better would be to upload the zip of your project. In the IDE File -> Export as zip
     
  12. Erel

    Erel Administrator Staff Member Licensed User

    It should be processBA instead of ba when called from an activity.
     
  13. Erwin Andersen

    Erwin Andersen Member Licensed User

    I will do it another time.

    Thank you
     
  14. Erwin Andersen

    Erwin Andersen Member Licensed User

    It is work. Thank you
     
Loading...
  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