Я должен использовать разные макеты для разных вариантов сборки, где в одном варианте есть элементы пользовательского интерфейса, которых нет в другом варианте.
Раньше я просто устанавливал элементы невидимыми / исчезнувшими, но теперь у меня есть NestedScrollView с дочерним фрагментом, который содержит RecyclerView. Ребенку нужна кнопка в одном аромате, которой не должно быть в другом аромате. Если я просто установил его невидимым или пропал, макет не работает должным образом (не прокручивается, а высота слишком мала).
Я скопировал макет xml в путь фрагмента, удалил кнопку и использовал отражение во фрагментном коде, чтобы узнать, существует ли кнопка, и реализую ее код.
Class<R.id> c = R.id.class;
R.id object = new R.id();
Field[] fields = c.getDeclaredFields();
for (Field field : fields)
{
field.setAccessible(true);
try
{
if (field.getName().equals("TheButton"))
{
Button tBtn = tView.findViewById((Integer) field.get(object));
if (tBtn != null)
tBtn.setOnClickListener(...);
}
} catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
После при обновлении инструментов сборки Gradle с 3.5.3 до 3.6.0 я получаю
ошибка: id () имеет частный доступ в id R.id object = new R.id ();
для строки
R.id object = new R.id();
при попытке построить. Сейчас я просто продолжаю использовать старые инструменты сборки, но я думаю, что это не постоянное решение.
Могу ли я сделать что-нибудь еще? Я хотел бы избавиться от рефлексии, но если это действительно единственный способ go, он должен работать с последними инструментами сборки ...