Диалоговое окно «Включить оповещения javascript» в веб-просмотре Xamarin Android CrossWalk

Оповещения java-script не работают в веб-просмотре пешеходного перехода

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

    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-файле, который я пытался показать и выбрать тег, но это не сработало.


person jsem    schedule 16.01.2019    source источник
comment
Я проверил ваш код и оповещения java-скрипта, не работающие в веб-представлении Crosswalk, с сообщением об ошибке, подобным этому: Вызвано: android.view.WindowManager$BadTokenException: невозможно добавить окно - токен null недействителен; ваша активность запущена? Вы можете решить эту проблему обходным путем: поднять alertDialog в вашем Foo() и внедрить метод всякий раз, когда вы хотите использовать оповещение в своем javascript. Кстати, не могли бы вы опубликовать свой код класса Foo? Так что я могу проверить это для вас.   -  person AbbyWang - MSFT    schedule 18.01.2019
comment
большое спасибо, я обновляю свой вопрос   -  person jsem    schedule 18.01.2019


Ответы (1)


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

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

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

1 экспортировать Alert()method в 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, и передайте строку в качестве параметра, чтобы установить, какое сообщение вы хотите предупредить.

индекс.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>
person AbbyWang - MSFT    schedule 19.01.2019
comment
спасибо, но я решаю проблему, нет необходимости проверять этот проект: github.com/mirzanove/Xamarin .Android.XПрогулка - person jsem; 20.01.2019
comment
ваше решение хорошо для одного случая, но мне нужно решение, которое работает для всех случаев, оказывается, оповещения javascript не будут работать, если вы создаете веб-просмотр динамически, но если вы обрабатываете его из макета, он будет работать, спасибо... - person jsem; 21.01.2019
comment
Что ж, рад, что помогло. И, погуглив эту проблему, я обнаружил, что это популярная проблема для многих людей. Я думаю, что ваше решение поможет им. Это очень хорошо. - person AbbyWang - MSFT; 21.01.2019
comment
да, мне пришлось нанять фрилансера, чтобы он дал несколько советов, как решить эту проблему, и он все исправил.. поэтому я создал проект на GitHub, чтобы помочь другим... спасибо, сэр. - person jsem; 21.01.2019