Тост-уведомления не работают при вызове JavaScript

avatar
Federico Navarrete
8 апреля 2018 в 06:25
311
1
1

Я разрабатываю приложение с помощью Xamarin.Android и хочу отображать всплывающее уведомление при экспорте отчета из JavaScript. Мое приложение вызывает отчет, и он успешно создан. Однако всплывающее уведомление никогда не отображается. Я обнаружил, что только когда я устанавливаю точку останова в этой конкретной строке, она отображается в Visual Studio 2017.

Это часть моего класса C# для работы с JS.

class CallJSInterface : Java.Lang.Object
{
    private class Timetable
    {
        public string member { get; set; }
        public string role { get; set; }
        public string time { get; set; }
        public string lastColor { get; set; }
    }

    private Context context;
    public CallJSInterface(Context context)
    {
        this.context = context;
    }

    [Export]
    [JavascriptInterface]
    public void ExportToExcel(string results)
    {
        Toast.MakeText(context, context.GetString(Resource.String.LblExportMsg), ToastLength.Short).Show();

        var timetable = JsonConvert.DeserializeObject<List<Timetable>>(results);

        //Excel conversion
    }
}

Это значение для LblExportMsg в Strings.xml:

<string name="LblExportMsg">Exporting your Agenda to Excel.</string>

Кроме того, это пример вызова функции в JS:

$("#linkDownload").click(function (e) {
    e.preventDefault();
    CSharp.ExportToExcel('[{"member":"Luis","role":"Timer","time":"00:15:15","lastColor":"red"},{"member":"Luis","role":"Timer 1","time":"00:15:00","lastColor":"green"},{"member":"Luis","role":"Timer 2","time":"00:15:17","lastColor":"red"},{"member":"Luis","role":"Timer 3","time":"00:07:15","lastColor":"green"},{"member":"Luis","role":"Timer 4","time":"00:23:15","lastColor":"red"},{"member":"Luis","role":"Timer 5","time":"00:15:15","lastColor":"green"},{"member":"Luis","role":"Timer 6","time":"01:15:15","lastColor":"yellow"},{"member":"Luis","role":"Timer 7","time":"00:18:15","lastColor":"green"},{"member":"Luis","role":"Timer 8","time":"00:15:22","lastColor":"green"}]');
});

Кроме того, кнопка HTML:

<button type="button" id="linkDownload">Export</button>

Наконец, вот как я добавляю интерфейс JS в WebView из основного действия:

webView.AddJavascriptInterface(new CallJSInterface(this), "CSharp");

Кто-нибудь знает, что я делаю неправильно? Это что-то связанное с контекстом? Как я могу это проверить? Спасибо за помощь.

ПС:

  • Минимальный SDK — 21, и он нацелен на SDK 27.
  • Я использую JSON.NET для десериализации.
Источник
York Shen
9 апреля 2018 в 09:13
0

Поделитесь, пожалуйста, вашим js-кодом.

Federico Navarrete
9 апреля 2018 в 09:19
0

Привет @YorkShen-MSFT, он есть, вот как я вызываю метод: CSharp.ExportToExcel(""); ничего особенного, я просто поделился JSON вместо пустой строки, которая полностью работает, потому что экспортирует успешно преуспевать. Спасибо.

York Shen
9 апреля 2018 в 09:34
0

Я не могу воспроизвести вашу проблему на своей стороне, поэтому поделитесь базовой демонстрацией или более полным кодом, чтобы мы могли воспроизвести эту проблему на своей стороне.

Federico Navarrete
9 апреля 2018 в 10:22
0

Нет проблем @YorkShen-MSFT, я добавил больше кода и пример JSON, который я ожидаю

York Shen
9 апреля 2018 в 14:07
0

Это странно, это должно работать. Не могли бы вы поделиться базовой демонстрацией, которая может воспроизвести эту проблему через онлайн-репозиторий?

York Shen
12 апреля 2018 в 07:43
0

Вы решили свою проблему? Если бы вы могли поделиться базовой демонстрацией, чтобы воспроизвести эту проблему, это было бы очень признательно! Просто чтобы убедиться, что мы проверяем то же самое, что и вы.

Federico Navarrete
12 апреля 2018 в 07:44
0

Привет @YorkShen-MSFT, не совсем так, я переношу код в оповещения Bootstrap, они работают как положено. На выходных продолжу.

York Shen
12 апреля 2018 в 07:44
0

Спасибо и с нетерпением ждем вашего ответа. :)

Federico Navarrete
15 апреля 2018 в 18:47
0

Привет @YorkShen-MSFT, я предоставил свое решение.

Ответы (1)

avatar
Federico Navarrete
15 апреля 2018 в 18:46
3

Мне удалось это исправить, я добавил тайм-аут перед экспортом отчета, а также разделил процесс на два: один для отображения всплывающего уведомления, а другой для отчета.

$("#linkDownload").click(function (e) {
    CSharp.Alert(currentTranslation.lblExportMsg);
    setTimeout(function () {
        CSharp.ExportToExcel(JSON.stringify(results));
    }, 250);
});