Розповідь про те, як ми мобільний додаток писали

Ділимося досвідом, як ми обходимо обмеження мобільної платформи.

Ця публікація - друга із циклу статей про створення простого додатка для мобільної торгівлі - Контейнер (Google Play і App Store). Що таке Контейнер, чому воно так називається і як ми боролися з подвійним заголовком, ми розповіли в першій статті:

В 1С неможливо відловити подія довгого тапа. Дане побажання вже звучало на партнерському форумі, але розробники платформи не планують його реалізовувати, тому що довгий тап не прийнято використовувати на iOS.

Розповідь про те, як ми мобільний додаток писали

Насправді в мобільній платформі довгий тап є. Якщо просто натиснути на рядок, то відразу відбувається її відкриття, але якщо натиснути і тримати - то рядок підсвічується синім і нічого не відбувається. Це зроблено, щоб користувач міг виділити рядок для виконання подальших дій - наприклад, зрушити або видалити. Проблема в тому, що розробник не може перевизначити цю поведінку, і, наприклад, показати користувачеві контекстне меню з варіантами дій.

Не може? Ой, та шо ви говорите!

Як відомо, при звичайному натисканні на рядок спрацьовує подія Вибір, і рядок відкривається. Якщо рядок просто виділити, то спрацює подія ПріАктівізацііЯчейкі. Здавалося б - що заважає помістити наш код в цю подію? Чи не все так просто - воно спрацьовує не тільки при виділенні, а й при натисканні. Коли ми натискаємо на рядок - вона на мить виділяється (це можна побачити неозброєним оком), а потім вже відкривається.

Отже, що ми маємо? При боргом тапе відпрацьовує тільки ПріАктівізацііЯчейкі, при короткому - ПріАктівізацііЯчейкі і Вибір. Висновок напрошується сам собою - якщо спрацювали обидві події - значить це Вибір, якщо спрацювала тільки Активізація - значить це довгий тап.

Як ми будемо це визначати? Напрошується простий варіант - у форми завести змінну ДолгійТап з типом булево, в подію ПріАктівізацііЯчейкі устаналівать її в Істину, а в Виборі в Брехня. При цьому в Активізації підключити Оброблювач очікування, який через півсекунди перевіряє - якщо ДолгійТап = Істина, тоді показуємо користувачеві меню, якщо Брехня - тоді нічого не робимо.
Сказано зроблено. Пишемо код:

Втім, навіть в такому варіанті цим користуватися можна. Але "можна" нас не влаштовує, тому ми продовжуємо експерименти.

Якщо придивитися, то корінь обох проблем криється в виділеному рядку. Значить, зробимо так - будемо очищати виділені рядки всюди, крім обробника Активізації, а в обробнику очікування поставимо перевірку на виділені рядки. Якщо виділені рядки є - значить, Активізації спрацювала, а Вибір - немає, отже, це довгий тап. Пишемо алгоритм:

Перевіряємо - перша проблема залишилася. При відкритті форми перший рядок все одно залишається виділеною (і спрацьовує довгий тап), як ніби виклик процедури примусового очищення рядків ігнорується платформою. Причому той же ситуація може виникнути і в настільній версії.

Зате друга проблема вирішилася - незважаючи на те, що після відкриття форми рядки сама рядок візуально залишається виділеною, повторний тап по ній спрацьовує і виконується наш обробник.

Подумаємо над першою проблемою. Тут є кілька варіантів обходу, але ми зупинилися на наступному реалізації: заведемо змінну форми ЛожноеВиделеніе з типом булево і при відкритті будемо присвоювати їй Істину, а в подію Активізації пропишемо, що якщо це помилкове виділення - то виділені рядки очищаються і нічого не відбувається. пробуємо:

Причому зверніть увагу - можна не тільки визначити свій обробник довгого тапа, але і встановити час затримки перед його спрацьовує (другий параметр процедури ПодключітьОбработчікОжіданія).

Ну і щоб вам два рази не вставати, до цієї статті ми докладаємо обробку, в якій реалізований простенький обробник довгого тапа - можна тапнуть по рядку і вибрати, що з нею зробити - перемістити вгору, вниз, або видалити.

Для обробки події тривалого натискання по рядку табличної частини потрібно скористатися комбінацій подій ПріАктівізацііЯчейкі і Вибір, в яких перевіряється, виділена поточна рядок.

Приклад реалізації наведено в обробці, прикріпленою до статті. В описаному алгоритмі також можна задати певну затримку, після якої спрацьовує обробник. Метод однаково працює на Android і iOS.

Післямова

Ми не прощаємось, і в наступній статті розповімо про наші прекрасні діаграми витрат і платежів. Залишайтеся з нами!

Вадим Невзоров
ХВОЯ интегра, Одеса