Morteza.Zaker
Morteza.Zaker

Reputation: 11

xamarin.android webview evaluatejavascript It does not return any value at all

I have a fundamental problem that I can not really understand where the problem comes from. I am designing a project by xamarin.android webview. Now I need to run a Java function in Web View and check the return value in a if function. I searched all the websites and in all of them I got the following code: In Main Activity Class:

public class MainActivity : AppCompatActivity
{
    WebView web_view;
.
.
.

Define web_view public in class

In OnCreate :

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.activity_main);
        web_view = FindViewById<WebView>(Resource.Id.webview);
        web_view.Settings.JavaScriptEnabled = true;
        web_view.Settings.BuiltInZoomControls = true;
        web_view.Settings.AllowContentAccess = true;
        web_view.SetWebViewClient(new HelloWebViewClient());
        
        web_view.LoadUrl("https://www.example.com");
        
    }

In Back Key Press:

public override bool OnKeyDown(Android.Views.Keycode keyCode, Android.Views.KeyEvent e)
    {
        if (keyCode == Keycode.Back)
                {       
                        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Kitkat)
                        {
                            JavascriptResult jsr = new JavascriptResult();
                            string strjs = "closePackageDetails();";
                            web_view.EvaluateJavascript(strjs, jsr);
                            string rrr = jsr.strResult;
                            Toast.MakeText(this, "message send:" + rrr, ToastLength.Long).Show();
                            
                    }
                        else
                        {
                            Toast.MakeText(this, "android version less 4.4" , ToastLength.Long).Show();
                        }
        }
    }

On JavascriptResult Class (separate on C# Class Palaced in MainActivity in Root directory)

    namespace webviewapp
{
    class JavascriptResult : Java.Lang.Object, IValueCallback
    {
        public string strResult;

        public void OnReceiveValue(Java.Lang.Object result)
        {
            Toast.MakeText(Android.App.Application.Context, "رسیدن نتیجه احضار شد", ToastLength.Long);
            strResult = ((Java.Lang.String)result).ToString();
        }
    }
}

<> Everything looks right and the program is debugged without error and the APK file is created successfully. After installing the program on the mobile phone and running it, the web page is loaded and everything looks good. By touching the back button, the JavaScript function is executed correctly and the result is visible in Web View. But the result, which is a boolean value, is not returned. In fact, the OnReceiveValue procedure does not work.

The variable 'rrr' always displays an null value.

Where it went wrong really puzzled me?

Upvotes: 1

Views: 720

Answers (1)

ColeX
ColeX

Reputation: 14473

It is happening because the callback is executed later than the next line ,so the variable 'rrr' is always null.

Add the breakpoint at OnReceiveValue and the line string rrr = jsr.strResult; to check it .

Just do the next thing directly in the method OnReceiveValue in the callback class.

Upvotes: 0

Related Questions