AndroidExplore, выпуск 1
Пока готовил новую версию Историка, пришлось столкнуться и исследовать несколько особенностей Android, дабы столкновения с ними в будущем проходили менее болезненно решил фиксировать самое интересное (дабы вновь не рыскать по stackoverflow.com, благодаря которому решается подавляющее большинство проблем)
1. getStringArray(), reference table overflow
Если вы используете означенный метод для работы с большими массивами строк и работаете с версиями ниже Android 2.3.3, то добро пожаловать в клуб начинающих парсеров.
getStringArray() не прибирает за собой как следовало бы, из-за чего происходит переполнение таблицы ссылок (в ней максимум 512 элементов), ну а из-за этого приложение банально падает.
Выходы:
а) перевод приложения на версии от 2.3.3
б) использование парсера
Выход а – не кошерный, поэтому идем и учимся использовать парсер. Мне подошел SAX parser:
Парсер однако не идеален, бывает так, что без причины бьет строки – для борьбы с этим используете методы startElement() и endElement(). И да, работает он медленнее встроенных функций.
2. Форматирование текста в xml файлах ресурсов
Наверняка, однажды захочется выводить в TextView не голый текст, а что-то, хоть слегка отформатированное, ну а для этого нет ничего лучше html, проблема лишь в том, что парсинг xml родными функция не дает должного результата.
А все потому, что все теги игнорируется, несмотря на то, что мы пытаемся их отобразить используя Html.fromHtml(), без паники несколько символов исправят положение:
<string name=”about”><![CDATA[
<p>Благодарю за установку приложения Историк.</p>
<p>Историк - это интерактивный справочник по истории России. Цель существования приложения - предоставить
удобный интерфейс для работы с массивом информации по истории нашей страны.</p>
<p>Если приложение вам понравилось, оставьте свою оценку на Android Market.</p>]]>
</string>
Чтобы получить и вывести отформатированный текст просто:
Spanned sp = Html.fromHtml(getResources().getString(R.string.about));
text.setText(sp);
Где text – экземпляр TextView.
3. Главный экран? Дайте два
Это повторялось уже не раз и не два, и даже не сотню, но мне удалось про это забыть, поэтому:
Нужно постоянно помнить о возможной смене ориентации – скорее всего приложение изменится так, что при должной НЕ подготовке вызовет facepalm у уставшего разработчика.
Выход: думать заранее об смене ориентации и готовить макеты сразу для портретного и ландшафтного вида. Оба должны иметь одинаковое имя, но один из них будет главным и скорее всего будет храниться в основной папке – layout, а второй будет лежать в папке layout-land или layout-port в зависимости от обстоятельств.
4. Сохранение данных или снова о смене ориентации экрана
При смене ориентации экрана Activity убивается, и метод onCreate вызывает еще раз (первый раз был при запуске Activity). Если вы не позаботитесь об сохранении данных, которыми оперирует приложение, то получите пустой экран (в зависимости от роли потерянных данных). Пример: приложение решения квадратных уравнений. Если вы осилили мануал, и получили приложение, то уже могли заметить, что при смене ориентации экрана все данных пропадают.
Выход:
1. Использование метода onSaveInstanceState(), читаем топовый ответ.
2. Использование SharedPreferences, опять читаем топовый ответ.
Что именно использовать зависит от ваших потребностей. Первый способ позволяет хранить данные в пределах Activity, второй в пределах всего приложения.
5. Загрузка https страниц
В работе с WebView я продвинулся не намного дальше, туториала от Google, но уже столкнулся с тем, что загрузить Маркет с помощью этого примера не получается.
Выход:
Добавить в класс Web-клиента этот метод:
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // Ignore SSL certificate errors
}