Мы получаем разные XML-строки от некоторых JNI-вызовов, которые представляют определенные макеты, которые мы в настоящее время анализируем самостоятельно, а затем программно создаем связанные объекты представления и устанавливаем все конкретные конфигурации.
Button bt = новая кнопка(activityMain); bt.setTag(тег); bt.setLayoutParams(параметры); bt.setTextColor(цвет); Сейчас перед нами стоит задача: мы хотим использовать стили, которые мы определили на стороне Java. Поэтому мы извлекаем значение атрибута style из заданной XML-строки, ищем идентификатор связанного ресурса, а затем используем его в качестве 4-го аргумента в конструкторе.
int styleID = ActivityMain.getResources().getIdentifier( имя стиля, "стиль", ActivityMain.getPackageName() ); Кнопка bt = новая кнопка (activityMain, null, 0, styleID); Проблема здесь в том, что, к сожалению, не все представления (которые мы сейчас реализовали в нашем собственном парсере) поддерживают конструктор с 4 аргументами, например MaterialButton или AppCompatTextView и многие другие.
Поэтому я попытался использовать конструктор с тремя аргументами для MaterialButton. Если я правильно понял, третий аргумент определяет некоторый элемент/атрибут из выбранной мной темы, который ссылается на некоторый стиль.
Поэтому я добавил для целей тестирования один пользовательский атрибут и настроил его следующим образом:
// attrs.xml // themes.xml ... @style/myButtonStyle //styles.xml @color/my_primary100 @color/white100 // myFile.java MaterialButton bt = новый MaterialButton(activityMain, null, R.attr.myButtonStyle); Но я оказался в ситуации, когда не все настройки стиля были приняты, и кнопка выглядела иначе, чем когда я создавал ее путем надувания некоторого предопределенного макета, который использует точно такой же стиль.
// myLayout.xml При поиске других способов сделать это я обнаружил проблему в этой теме на github: создание кнопки со стилем программным способом не устанавливает все атрибуты
Разница, которую я здесь вижу, заключается в том, что стиль в примере решения имеет родительский элемент:
@color/... @drawable/.... @color/.... Это причина того, что на моей стороне это работает некорректно? Действительно ли стиль, на который есть ссылка в моей теме, должен определять стиль материала в качестве родительского, чтобы принять все настройки?
Нет ли другого решения моей «задачи»? Потому что стиль, на который я ссылаюсь, может использоваться и другими представлениями, а не только материальными. Поэтому я не всегда могу добавить туда родителя.
Я также открыт для других идей
Мобильная версия