Я пишу несколько пользовательских представлений, которые имеют некоторые одноименные атрибуты. В соответствующем <declare-styleable>
разделе attrs.xml
я хотел бы использовать те же имена для атрибутов:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView1">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
</resources>
Я получаю сообщение об ошибке, myattr1
и myattr2
это уже определено. Я обнаружил, что должен опустить format
атрибут для myattr1
и myattr2
в MyView2
, но если я это сделаю, я получу следующую ошибку в консоли:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
Есть ли способ, которым я мог бы сделать это, может быть, какое-то пространство имен (просто угадать)?
myattr1
в строкеMyView1
и целое числоMyView2
?ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr
За все мнение, за которое я пытаюсь заявить. Любые идеи?<attr name="myattr1" format="string|integer" />
. Работает для меня.Я публикую этот ответ, поскольку вышеприведенное решение не помогло мне в Android Studio. Мне нужно поделиться своими пользовательскими атрибутами среди своих пользовательских представлений, поэтому я попробовал вышеуказанное решение в Android Studio, но безуспешно. Так что я экспериментирую и иду способ сделать это. Надеюсь, что это может помочь кому-то, кто ищет ту же проблему.
Это работает для меня полностью. Нам нужно сделать родительский стиль стилевым, а затем нам нужно наследовать этот родительский стиль. Например, как я уже делал выше: родительское стилевое имя MyView и унаследовало его от другого моего стиля, такого как MyView1 и MyView2 соответственно.
источник
MyView2
права:R.styleable.MyView2_myattr1
, неправильно:R.styleable.MyView_myattr1
)Как ответила Прия Сингхал, Android Studio требует, чтобы имена общих атрибутов были определены в их собственном имени стиля. Они больше не могут быть в корне.
Однако есть еще несколько моментов, на которые следует обратить внимание (поэтому я также добавляю ответ):
пример
Вот что я сделал в недавнем проекте, который имеет два пользовательских представления, которые имеют одинаковые атрибуты. Пока пользовательские представления по-прежнему имеют имена для атрибутов и не включают в себя
format
, я все равно могу обращаться к ним как обычно из кода.Упорядоченный пример
На самом деле, мне даже не нужно помещать атрибуты под произвольным именем. Пока я определяю их (даю им
format
) хотя бы для одного пользовательского представления, я могу использовать их где угодно (безformat
). Так что это также работает (и выглядит чище):Для большого проекта, однако, это может привести к путанице, и определение их сверху в одном месте может быть лучше (как рекомендуется здесь ).
источник
parent
атрибутом, но не видел много сообщений, предлагающих его использование.parent
. Я думаю, я просто сказал, что это не требуется.Спасибо Льюису, у меня была та же проблема, и ваше решение по наследованию дало мне подсказку сделать это, как показано ниже, и оно работает нормально. Я просто объявил общие атрибуты выше и переписал их в теле объявления стиля снова без форматирования. Я надеюсь, что это помогает кому-то
источник
На всякий случай, кто-то все еще застрял с этой проблемой после того, как попробовал доступное решение. Я застрял с добавлением
subtitle
атрибута сstring
форматом.Мое решение - удалить формат.
перед:
<attr name="subtitle" format="string"/>
после:
<attr name="subtitle"/>
источник