ADMClient
Новый Android клиент форума "Мастера Delphi" www.delphimaster.ru Google Play
Описание
Клиент представляет из себя виджет для чтения форума с возможностью создавать темы, отвечать/цитировать.
Особенности
- Клиент работает на Android 4.1 и выше (API 16+).
- Возможность добавить пост, или тему в закладки
- Полнотекстовый поиск тем и постов, плюс фильтрация по помеченным темам/постам
- Автоматическое обновление помеченных тем каждые 15 минут при наличии интернета (включается в настройках)
- Возможность выбрать дневную/ночную тему
- Кастомизация темы выбранным цветом
Разработка
- Android Studio 3.2.1
- Room (Entity, DAO) - база данных
- Retrofit2 - работа с сетью
- WorkManager - работа с базой данных в background (вставка/обновление), переодическая работа с сетью
- ViewModel, LiveData - представление данных
- Векторные элементы графики
Сложности
Тема в android задается xml файлом стилей, притом она - иммутабельна. Расширение класса "Resources" для перехвата вызова цветов (например "colorPrimary") не увенчалась успехом. Возможно это потому, что все Activity наследуются от AppCompatActivity. Поэтому для кастомизации темы выбранным цветом, используется ранее сгенерированный файл стилей (градация цветов с шагом 15 единиц без альфаканала (RGB): #000000, #00000f, #00001e и т.д.). При (ограниченном) выборе пользователем цвета - к теме применяется "цветовой" стиль
Цвет иконок меню
Цвет меню иконок можно задать в xml файле описания меню:
<item
android:id="@+id/about"
android:icon="@drawable/ic_about"
android:onClick="onAboutItemClick"
app:iconTint="@color/colorPrimary" <-- цвет
android:title="@string/about"
app:showAsAction="ifRoom" />
Но т.к. в мобильном приложении тема может динамически меняться (context.getTheme().applyStyle...), то
app:iconTint="@color/colorPrimary"
будет не актуальным решением (в colorPrimary лежит цвет прописанный в colors.xml)
Поэтому что-бы иконка приобрела цвет темы (присвоенной динамически через applyStyle), необходимо использовать:
app:iconTint="?attr/colorPrimary"
В этом приложении, iconTint применен для всех подменю с флагом (выпадающее меню):
app:showAsAction="ifRoom"