Android: повернуть картинку через XML

Иногда в Android-проекте требуется иметь несколько версий одной и той же картинки, но с поворотом на определённый угол. Скажем, речь может идти об указывающих на что-то стрелках, «хвостиках» контекстных balloon-ов, градиентных границах и тому подобной графике.

Конечно, требования к некоторым картинкам бывают таковы, что дизайнеру приходится вращать их вручную, дорисовывая недостающие детали. Но если кроме угла поворота никаких отличий нет, то плодить много графических ресурсов попросту неразумно: растёт размер .apk, усложняется внесение изменений, да ещё и нарушается принцип «работать должна машина»… в общем, неудивительно что подобные сценарии учтены в Android с самых первых версий, и мы можем со спокойной совестью пользоваться уже готовым инструментом. Например, на скриншоте ниже использовано только одно растровое изображение оранжевой стрелочки — то, что в заголовке. Остальные варианты получены через xml drawables, без единой строчки java-кода!

Поворот одной и той же картинки на разные углы
Поворот одной и той же картинки на разные углы

Читать далее

Google Play не подключается: что ещё сделать?

Что ж, начну с неприятного предположения: допустим, у вас не подключается Google Play Market (пишет «подключение отсутствует», «проверьте соединение» или «не удалось подключиться к серверу»), а установка правильного времени не сработала, или время уже было правильным. Что же всё-таки сделать для восстановления работы сервисов от гугла?

Без маркета — как без рук!
Без маркета — как без рук!

Здесь я приведу (и буду пополнять) некий чеклист, по которому при проблемах подключения следует пройтись в первую очередь. Идите по нему именно в том порядке, в котором перечислены пункты, не перескакивая (единственное исключение — если ставили freedom, то можно сразу читать раздел про /etc/hosts).

Тема, как показывает практика, оказалась востребованной.

Итак…

Читать далее

Множественное число на Android

В амазонских джунглях живет племя, в языке которого есть всего три слова для обозначения чисел — «один», «два» и «много»

Фактрум

В нашей жизни (а особенно — в интерфейсе наших программ!) очень часто встречаются числительные. Цена чего-либо? Число. Количество записей или комментариев к ним? Всё числа. Продолжительность какого-либо периода? Это зачастую даже несколько чисел: например, дни, часы и минуты. В общем, без чисел — никуда.

И чем важнее представленная числом информация, тем неприятнее человеку видеть на экране что-нибудь такое:

21 комментариев
21 комментариев. Без комментариев.

Бросается в глаза, согласитесь? Сразу видно: текст «механический». Взгляд спотыкается на такой строчке, мозг фиксирует грубую грамматическую ошибку. Вот сравните, например, со скриншотом из популярной социальной сети:

21 комментарий
А вот тут глазу цепляться не за что

Осознавая эти тонкости, многие пытаются выводить числа просто в скобочках или после двоеточия («комментарии: 21»). Это не самый плохой компромисс: текст хоть и веет всё той же механистичностью, но по крайней мере остаётся согласованным при любом числе. Однако же — зачем нам компромиссы? Правильное склонение — одно из требований к современному приложению, и больших усилий его реализация не потребует — всё уже написано до нас!

Собственно, нужный нам механизм лежит на самой поверхности, да и называется без особых изысков — Quantity Strings (plurals). Появился он ещё в самых первых версиях Android, но не пользовался у наших разработчиков большой популярностью, поскольку реализован был с ошибками. Однако же теперь, начиная с Honeycomb, ошибки исправлены, а для более старых версий — написана и свободно доступна исправляющая ошибки библиотечка.

Читать далее

Google Play: подключение отсутствует?

The planet is fine. The people are f*cked.

George Carlin

Обратите внимание: у этой статьи есть более полная версия

Нам всегда неприятно если что-то не работает. А если мы не понимаем причин — то неприятно вдвойне.

Вот вы включаете своё Android-устройство (в моём случае это оказался старенький Samsung Galaxy Tab 7.0, что не принципиально), успешно соединяетесь с сетью, можете открывать сайты в браузере, но… Google Play пишет «подключение отсутствует», его примеру следуют Gmail, Google Maps и все прочие гуглосервисы. Узнали свою ситуацию?

Информативность ошибки — просто потрясающая. Как так — отсутствует?! А что же я тогда вижу на экране?! Да-да, вот тут, в браузере! Почему же гуглу это соединение не нравится?

Что ж, не буду долго томить, раскрою секрет: гугловские приложения в большинстве случаев просто не могут проверить корректность сертификата из-за неправильно установленного на устройстве времени! Т.е. сеть есть, и Google отвечает, но андроиду этот ответ кажется подозрительным из-за больших расхождений во времени на устройстве и на сервере. А все сомнения трактуются в пользу безопасности: соединение не устанавливается. Вот и «отсутствует» подключение.

Итого, решение: выставить правильное время, или включить его синхронизацию с сетью (Настройки → Дата и время). Очень важно к тому же указать верный часовой пояс! И всё магически начинает работать в тот же момент.

Настройки даты и времени, включено использование NTP
Настройки даты и времени, включено использование NTP

P.S. Эта заметка приобрела определённую популярность, потому хочу сказать в дополнение: увы, я не гарантирую что именно этот метод поможет. Google Play показывает одну и ту же ошибку для всех возможных проблем (видимо, там работают очень ленивые люди, которых ломает сделать несколько сообщений), и вполне могут быть необходимы другие методы лечения. Но судя по комментариям — именно проблема с установкой времени как раз и выдаёт «подключение отсутствует» у большинства.

 Если же проблема сохраняется, то у материала есть продолжение:

Google Play не подключается: что ещё сделать?

Сборка iconv под Android NDK

Недавно встала передо мной в полный рост проблема перевода различных кодировок на платформе Android.

Казалось бы, любой java-разработчик тут должен усмехнуться и молча ткнуть пальцем в обычнейший String, — мол, всё уже украдено до нас, знай только Charset передай, или просто имя кодировки. И здесь бы я с ним согласился, набил нужный код и закрыл тему, но только вот задачу эту потребовалось решить в рамках NDK, на C++. И хотя форумы пестрят пикантными советами использовать всё те же вызовы Java через JNIEnv, очевидно, что метод сей сильно паршив по производительности, надёжности, да и просто по красоте, потому годится далеко не всегда и не везде.

В голову сразу же приходят (ну или: гуглом сразу же находятся) два очевидных решения: ICU и libiconv. Читать далее