PhoneGap - вирішення проблем у першому додатку

PhoneGap - HTML5 платформа для розробки додатків під 7 існуючих мобільних платформ. Днями вони оновилися до версії 1.2.0 та переїхали під крило Апачі. Адреса репозиторію також оновилася. На сайті в документації чудова покрокова інструкція для створення першої програми, так що на вступній частині більше не зупинятимемося, про це вже писали. Дрібні проблеми починаються, коли трошки виходиш за межі стандартних можливостей платформи, але все вирішуване.

Постановка задачі

Для зберігання налаштувань скориставсяwindow.localStorage. Зробив на основній html сторінці діалог з потрібними полями введення і повісив обробник на події 'menubutton', 'backbutton', щоб його показувати/заховати/зберігати. Все працює як слід. Пізніше додав туди збереження історії запитів.

Напис на дефолтовій кнопці

При відкритті софтверної клавіатури дефолтова кнопка має напис 'GO'. Що не дуже відповідає роботі зі словником. Документація фреймворку такої ситуації ніяк не висвітлює. Документація в SDK говорить про встановлення атрибутуandroid:imeOptionsполя введення. Але, звичайно, всередині браузера це не працює. Кілька разів перерив інет у пошуках рішення. Нарешті наткнувся на робочий варіант під iPhone - замість треба використовувати. Причому елемент форми обов'язковий. Під Андроїд працює і без форми, а форма навіть шкідлива, тому що відбувається її відправлення і треба цю справу запобігати. Отже використовуємо і дефолтова кнопка чарівним чином перетворюється на 'Search'.

Вихід із програми

У фреймворку є API для цього - navigator.app.exitApp(). Як виявилось, просто з коробки це не працює. Щоб змусити це працювати вAndroidManifest.xmlтреба прописати . У новій версії 1.2.0проблему вже виправили, тому це ще один привід оновитися.

Переклад із буфера обміну
Автоматичний виклик та переклад

Але немає межі досконалості. Хотілося ще менше рухів тіла. Читалка має інтеграцію з 2-ма словниками - Fora Dictionary і 2 способи виклику ColorDict. Скачав вихідники читалки, благо вони відкриті, подивився, як відбувається виклик. На жаль обидва словники зашиті, хоч і викликаються стандартним способом і могли б конфігуруватися. Тому виникла думка прикинуться, наприклад, форою. Цієї інструкції з документації SDK цілком достатньо, щоб реалізувати потрібний пошуковий інтерфейс, отримувати переданий для пошуку рядок і передавати його параметром в урлі. Стандартна реалізаціяonCreateстала виглядати так:

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

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

Випадання програми при зміні орієнтації екрану

Після додавання пошукового інтерфейсу та перейменування класів у новий проект додаток став вивалюватися при зміні орієнтації з помилкою «show which view has focus because the focused view… has no id». Оскільки пошук показав, що ця проблема трапляється, то згадаюяк це вирішилося. Що саме виявилося вирішальним, я не став розбиратися. При створенні нового проекту я пропустивAndroidManifest.xml— в кореневому елементіmanifest:

- уapplicationелементі не створив activity:

В усіх activity потрібен атрибут andro. Звичайно, це я сам накосячив, т.к. в "hello world" все це є. Просто будьте уважні.

Додаток вийшов дуже скромних розмірів - 186к (крім словникових даних). Хоча спочатку була ідея після PhoneGap зробити все за стандартним процесом, але т.к. результат влаштовує на всі 100%, то сенсу в цьому не бачу.

ЗИ. дякую Vadim Lopatin за Cool Reader з вихідними текстами, дякуємо творцям PhoneGap за доступну платформу з вихідними текстами, дякуємо творцями плагінів з сорцями, гітхабу за доступ до вихідних текстів, і бітбакет за зберігання моїх.

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»