Полезные находки
Предлагаю в этой теме собирать всякие полезные находки, которые вы используете.
Решение тех или иных проблем. Ссылки на что-то интересное. |
Ответ: Полезные находки
Недавно делал восстановление открытых окошек после поворота экрана.
Самодельный велосипед с сохранением данных в преференсы. А тут нашёл простое решение - http://developer.android.com/referen...#configChanges Прописываем в манифесте для активити строку PHP код:
Если нужно обработать изменения (н-р, обновить лэйауты для гориз. ориент.), то добавляем колбэк PHP код:
Если кто-то знает проблемные места этого подхода, расскажите. |
Ответ: Полезные находки
Свойство android:clipToPadding="false"
Позволяет при наличии паддингов у элемента видеть содержимое такого размера, будто паддингов нет. Может быть полезно в списках - когда нужен отступ сверху / снизу, и чтобы содержимое не выглядело обрезанным. |
Ответ: Полезные находки
Использование AlertDialog.Builder
1. Использовать android.support.v7.app.AlertDialog - для получения стиля material design, ничего делать не нужно, диалог сразу будет в стиле материал при импорте суппорт-версии. 2. Создание диалога AlertDialog dialog = builder.create(); a) если после создания назначать кнопки через setXXXButton, то их не будет в диалоге. это очевидно. б) назначение лисенеров, например, builder.setOnDismissListener после создания диалога - лисенер не применится. тоже очевидно, но можно не доглядеть. как? например, какая-то вьюха внутри диалога должна по нажатию закрывать диалог. значит, нам нужно создать диалог раньше, чем это вьюшку. и значит, лисенеры нужно навесить ещё раньше. есть вероятность несоблюдения этого порядка. в) при нажатии на диалоговские кнопки, диалог закрывается. это не всегда уместно. часто нужна проверка введённых данных. для этого ставим кнопке listener в null, и далее после создания диалога PHP код:
г) Назначение dialog.setOnShowListener() после вызова dialog.show() - слушатель не сработает. |
Ответ: Полезные находки
Цитата:
Перехватом configChanges надо пользоваться осторожно, т.к. андроид все равно найдет способ уничтожить твой activity и пересоздать его заново. Например - юзер сворачивает приложение в фон -> чем-то там занят -> Андроид решил что ему не хватает оперативной памяти -> убил твой activity -> юзер закончил свои дела, и вернулся к твоей программе -> Андроид создает activity заново. |
Ответ: Полезные находки
Пересоздание активити после его закрытия/сворачивания - не проблема, создаём всё с чистого листа и всё.
Проблема именно в повороте экрана, когда юзер ожидает, что прога должна оставаться такой, какая была до поворота. |
Ответ: Полезные находки
Фильтрация данных на уровне адаптера VS на уровне sql-запроса.
При работе с базой данных иногда нужно отсеять часть информации. Например, в моей проге по долгам есть опция "показывать нулевой баланс" - т.е. все записи с нулевым балансом либо отображать либо нет. У меня это было сделано на уровне запроса к базе - в зависимости от опции добавлял параметр. Однако, мне также нужно хранить информацию обо всех контактах, включая тех, кого скрыли из-за нулевого баланса. (Например, все контакты должны быть доступны в фильтре контактов в истории и в автоподстановке при вводе имени.) В итоге пришлось делать ещё один запрос, выгребающий все контакты. Но сегодня пришла идея - отсеивать "нулевые" записи в адаптере, который выводит информацию на экран (CursorAdapter). Для этого добавляем в адаптер 2 метода: PHP код:
PHP код:
И в методе PHP код:
PHP код:
И наш единожды запрошенный курсор хранит информацию обо всех контактах в таблице, можем использовать его для любых нужд. |
Ответ: Полезные находки
меню Analyze | Inspect Code...
В Android Studio есть полезная штука - анализ кода, который подсказывает потенциальные ошибки типа "присваивание переменной в саму себя" (после рефактора можно не заметить) и неиспользуемые методы, полезно для чистки большого проекта от шлака. |
Ответ: Полезные находки
Gradle Retrolambda Plugin (ссылка)
Что: Плагин, который позволяет юзать лямбды в старых версиях джавы (нативно они доступны в java 8 ). Зачем: повышает читабельность кода, избавляет от необходимости писать "лишний" Примеры: было PHP код:
PHP код:
PHP код:
слушатель для кнопки "оставить отзыв". было PHP код:
PHP код:
|
Ответ: Полезные находки
Массивы в шаблонных типах в Java.
Интро. Я глядя на RxJava решил сделать некое подобие, но попроще. Полученную штуку назвал CallChain - это цепочки вызовов методов. Суть: составляем последовательность операций в цепочку "операторов", на вход очередного оператора подаётся выход из предыдущего. Профит - удобно составлять логику, ошибки всегда прокидываются до получателя, можно остановить выполнение на любом этапе. (я это сделал в виде worker - operator(s) - receiver (операторы обычно тоже worker'ы). Кароче, суть "проблемы" открылась при добавлении оператора, который бы превратил массив в последовательность единичных элементов (flatMap). Оператор наследуется от базового Chunk<TIn,TOut>{ ... } т.е. у него есть тип входных данных и тип выходных. Прицепляемый к нему оператор должен на вход получить выход от текущего, а на выходе может иметь любой тип, т.е. Chunk<TOut,TOut2> Так вот, как из шаблонных типов вытащить массив? Я не долго думая написал для нашего flatMap'а такой вариант: Chunk<TOut[],TOut> В надежде, что если мы на вход даём Integer[], то TOut распознается как Integer. И это так, но только в рамках самого класса! В каждом операторе есть входной метод Код:
void onReceive<TIn data>{ ... } Код:
void onReceive<TOut data>{ // здесь TOut, т.к. на вход берём быход от предыдущего оператора Однако, когда к этому оператору хотим прицепить следующий, у которого на входе должен быть штучный Integer, то получаем ошибку нестыковки типов - "на входе ожидается массив Integer[]". Т.е. наш TOut вне самого класса оператора расползнаётся как массив. Но тогда логично, что конструкция <TOut[],TOut> должна развернуться в <Integer[][],Integer[]> внутри класса, но этого не происходит. И это немного сломало мне мозг. :) ^ Ради этой инфы и написан этот пост. В итоге я добавил шаблонный тип TOut2 к этому оператору Код:
public <TOut2> Chunk<TOut,TOut2> flatMap() { ... } (проверка на массив или итератор делается через instanceof; не фэншуй? зато работает, и я пока на экспорт не планирую отдавать, а мне норм такой вариант). при использовании теперь нужно явно указывать тип Код:
new CallChain() кому интересен весь код - гитхаб. Да, я смотрел исходники RxJava, но нихрена не понял, умеют же люди писать такие заморочки. :) |
Ответ: Полезные находки
Проверка нажатия кнопки HOME.
Переопределяем метод активити: PHP код:
|
Ответ: Полезные находки
Переопределение методов в момент создания класса
Иногда требуется переопределить какой-либо метод класса или несколько, и при этом не хочется создавать новый класс-наследник в отдельном файле. Например, нужно запретить клик и выделение по клику в дефолтном андроидовском адаптере. Переопределяем нужный метод непосредственно при создании класса: PHP код:
|
Часовой пояс GMT +4, время: 16:34. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot