Рассматривается задача установки полупрозрачного цвета неактивным иконкам на табах (по гайдлайнам иконки должны быть прозрачными на 30%).
Первый вариант решения данной задачи - использование <selector>
в отдельном xml-файле:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/testicon_select" android:state_selected="true"/>
<item android:drawable="@drawable/testicon" />
Я так понял, что такой отдельный xml
-файл должен быть для каждого таба, итого по 3 файла на таб:
Не глупо ли? Я считаю, что такое решение неприемлемо в 21 веке.
Представленное ниже программное решение работает.
protected void initMainViewTabs(){
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager);
tabLayout.getTabAt(0).setIcon(R.drawable.ic_menu_tabOne);
tabLayout.getTabAt(1).setIcon(R.drawable.ic_menu_tabTwo);
tabLayout.getTabAt(2).setIcon(R.drawable.ic_menu_tabThree);
tabLayout.getTabAt(3).setIcon(R.drawable.ic_menu_tabFour);
tabLayout.getTabAt(1).getIcon().setAlpha(179);
tabLayout.getTabAt(2).getIcon().setAlpha(179);
tabLayout.getTabAt(3).getIcon().setAlpha(179);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
tab.getIcon().setAlpha(255);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
tab.getIcon().setAlpha(179);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
Можно ли сделать его ещё лаконичнее? На данный момент, в нём много хардкода, но вероятно, на пока нет средств его сократить. Кроме того - как такое решение с точки зрения производительности?
Множества промежуточных xml файлов можно избежать путем вложенностей:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape>
<solid android:color="@color/cerulean_pressed" />
<corners android:radius="4dp" />
<padding android:right="16dp"
android:left="16dp"/>
</shape>
</item>
...
<item>
<shape>
<solid android:color="@color/cerulean" />
<corners android:radius="4dp" />
<padding android:right="16dp"
android:left="16dp"/>
</shape>
</item>
</selector>
Затем продумав дизайн можно описать стили и объединить их в темы. Если правильно подойти к этому этапу, то в следующий раз Вы просто скопируете шаблоны в папку drawable
и в одном месте поменяете цвета (при условии, конечно, что в обеих случаях нет серьёзных кастомизаций и отклонений от рекомендованого варианта от Google). Скорость работы с таким подходом точно выше сравнительно с Java
-методами.
Так как основная часть UI
является статической (фон, шрифты, текстовые атрибуты, иконки и т.д.), а все варианты динамики должны быть предусмотрены, они все описываются в xml
и такие файлы используются как ресурсы, которые нигде не пересекаются с логикой.
Использовать в этих целях Java
, скорее всего, правильно когда пользователь очень сильно углубляется в изменения дизайна приложения и может все тонко настраивать, но даже в таком случае такие настройки придется хранить (и как вариант в том же самом xml
).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Можно ли из java кода вызвать готовые функции из dll, написанного на C++, а не писать dll изначально под java?
Добрый день, работаю с сервером на java в документации к нему говориться что следует для его запуска добавить в jvm флаг, дословно
есть файл, с него надо найти и считать два рядочка, по 3 числа в каждомэтих рядочков может быть много
Наставьте на путь истинный, что и где должно быть реализовано для взаимодействия контроллера и сервисаСигнатуры методов нивелированы!