Включить диалог предупреждений JavaScript в веб-представлении xamarin Android CrossWalk - PullRequest
0 голосов
/ 17 января 2019

Предупреждения java-script не работают в Crosswalk Web-view

вот что я пробовал:

    protected override void OnXWalkReady()
    {
        fa = this;

        var view = new RelativeLayout(this.BaseContext);
        var mp = ViewGroup.LayoutParams.MatchParent;
        xwv = new Org.Xwalk.Core.XWalkView(this.BaseContext, this);
        view.AddView(xwv);
        this.AddContentView(view, new ViewGroup.LayoutParams(mp, mp));
        XWalkPreferences.SetValue("enable-javascript", true);
        xwv.SetResourceClient(new XWalkResourceClient(xwv));
        xwv.SetUIClient(new XWalkUIClient(xwv));
        xwv.AddJavascriptInterface(new Foo(this, xwv), "Foo");
        xwv.LoadUrl("file:///android_asset/index.html");
    }

Предупреждения JavaScript работают по умолчанию в Android-студии при использовании Crosswalk, но не Xamarin ..

обновление

class Foo : Java.Lang.Object
//, Java.Lang.IRunnable
{
    Context context;
    XWalkView xwv;
    Activity activity;
    public Foo(Context context, Org.Xwalk.Core.XWalkView xwv)
    {
        this.context = context;
        this.activity = activity;
        this.xwv = xwv;
    }


    [Org.Xwalk.Core.JavascriptInterface]
    //[Export]
    /// [JavascriptInterface]
    [Java.Interop.Export("Run")]
    public void Run(string text, string id)
    {

     Toast.MakeText (context, text,ToastLength.Long).Show();
    }
   }

HTML-файл индекса:

   <body>
   <div  onclick="clicked()">Say Hello</div>
    <script>
        function clicked() {
        alert();
         Foo.Run('this test from js', "1");
        }
    </script>
   <select>
        <option value="volvo">Volvo</option>
        <option value="saab">Saab</option>
        <option value="mercedes">Mercedes</option>
        <option value="audi">Audi</option>
    </select>
   </body>

это мои HTML-элементы в индексном HTML-файле, я пытался показать предупреждение и выбрать тег, но это не сработало.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Я исправил эту проблему, и для всех, кому нужно, чтобы диалог java-скрипта отображался в пешеходном переходе, веб-просмотр Xamarin проверяет этот проект: https://github.com/mirzanove/Xamarin.Android.XWalk

0 голосов
/ 19 января 2019

Я проверил ваш код и предупреждения Java-скрипта, не работающие в Crosswalk Web-view, с сообщением об ошибке вроде этого: "Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?"

Вы можете решить эту проблему с помощью обходного пути: поднимите alertDialog в вашем Foo() и внедрите метод всякий раз, когда вы хотите использовать alert в вашем javascript.

Я написал демо на основе вашего размещенного кода, вы можете попробовать его:

1 экспорт метода Alert() в Foo для отображения alertDialog

   protected override void OnXWalkReady()
            {
                var fa = this;

                var view = new RelativeLayout(this.BaseContext);
                var mp = ViewGroup.LayoutParams.MatchParent;
                var xwv = new Org.Xwalk.Core.XWalkView(this.BaseContext, this);
                view.AddView(xwv);
                this.AddContentView(view, new ViewGroup.LayoutParams(mp, mp));
                XWalkPreferences.SetValue("enable-javascript", true);
                xwv.SetResourceClient(new XWalkResourceClient(xwv));
                xwv.SetUIClient(new XWalkUIClient(xwv));
                xwv.AddJavascriptInterface(new Foo(this, xwv), "Foo");
                xwv.Load("file:///android_asset/index.html", null);
            }
        }

        class Foo : Java.Lang.Object
        //, Java.Lang.IRunnable
        {
            Context context;
            XWalkView xwv;
            Activity activity;
            public Foo(Context context, Org.Xwalk.Core.XWalkView xwv)
            {
                this.context = context;
                this.activity = activity;
                this.xwv = xwv;
            }


            [Org.Xwalk.Core.JavascriptInterface]
            //[Export]
            /// [JavascriptInterface]
            [Java.Interop.Export("Run")]
            public void Run(string text, string id)
            {
                Toast.MakeText(context, text, ToastLength.Long).Show();
            }

            [Org.Xwalk.Core.JavascriptInterface]
            //[Export]
            /// [JavascriptInterface]
            [Java.Interop.Export("Alert")]
            public void Alert(string text)
            {
                AlertDialog.Builder alert = new AlertDialog.Builder(context);
                alert.SetTitle("Alert Message");
                alert.SetMessage(text);
                alert.SetPositiveButton("OK", (senderAlert, args) =>
                {
                    //Toast.MakeText(context, "OK!", ToastLength.Short).Show();
                });

                Dialog dialog = alert.Create();
                dialog.Show();
            }

2 Вызывайте метод Alert () всякий раз, когда вы хотите отобразить предупреждение в index.html, и передайте строку в качестве параметра, чтобы указать, какое сообщение вы хотите предупредить.

index.html:

<body>
   <div  onclick="clicked()">Say Hello</div>
    <script>
        function clicked() {
            Foo.Alert("This is alert message");
            Foo.Run('this test from js', "1");
        }
    </script>
   <select>
        <option value="volvo">Volvo</option>
        <option value="saab">Saab</option>
        <option value="mercedes">Mercedes</option>
        <option value="audi">Audi</option>
    </select>
 </body>
...