Подтвердить что ты не робот

Можно ли добавить настраиваемое свойство в стиль в ресурсе android?

Я использую компонент потока представления в свой проект, который позволяет разработчику переопределять некоторые атрибуты, например:

<org.taptwo.android.widget.TitleFlowIndicator
    ...
    app:footerTriangleHeight="0dip"
    ... />

Я повторно использую этот компонент в нескольких макетах, и я хотел бы поместить свойства в стиль. Но когда я это делаю, парсер говорит Error: No resource found that matches the given name: attr 'app:footerTriangleHeight', даже если я добавлю пространство имен в файл стилей.

Есть ли способ сделать это в android?

Спасибо.

4b9b3361

Ответ 1

Android-приложение

Если вы не используете Android-библиотеки, вот что вы можете сделать:

  • Определить настраиваемый атрибут стиля (думаю, вы уже это сделали).
  • Не используйте префикс пространства имен в элементах стиля (пространство имен по умолчанию относится к текущему пространству имен приложений).

Пример:

В attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="testAttr" format="string"/>        
</resources>

В styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>        
    <style name="TestStyle" >
      <item name="testAttr">asdf</item>
    </style>        
</resources>

Библиотека Android

Если пользовательский атрибут поступает из библиотеки Android, вы все равно можете использовать описанный подход. Теоретически это должно работать, потому что пространство имен Android Library такое же, как и приложение (с точки зрения инструмента aapt во время сборки). Но я не испытал это сам.


Если вы укажете пространство имен, появится сообщение об ошибке. Насколько мне известно, стили не поддерживают пространства имен xml. Таким образом, это не будет выполнено:

В styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:app="http://schemas.android.com/apk/res/app.package.name">        
    <style name="TestStyle" >
      <item name="app:testAttr">asdf</item>
    </style>        
</resources>

Parser автоматически по умолчанию использует текущее пространство имен приложений AndroidManifest, хотя вы не можете явно указать это пространство имен.

Ответ 2

Вы можете определить стиль в терминах вашего пространства имен, я сам использовал его

то есть

<style name="whatever">
    <item name="YourPackage.YourSubPackage:parametername">@drawable_or_anything/bla</item>
</style>