Использование ссылки на атрибут в селекторе StateListDrawable - PullRequest
1 голос
/ 09 июня 2019

Я пытаюсь сослаться на ?attr/selectableItemBackgroundBorderless в XML определении StateListDrawable, чтобы изменить поведение некоторых состояний, определенных в оригинале:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/transparent" android:state_pressed="false" />
    <item android:drawable="?selectableItemBackgroundBorderless" />
</selector>

Но это приводит к сбою:

Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 0: TypedValue{t=0x2/d=0x7f040298 a=-1}
  at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:946)
  at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
  at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:177)
  at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:122)
  at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
  at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332)
  at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291)
  at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:833)
    ... 46 more

Чего я не понимаю, так это того, почему он на самом деле работает с LayerDrawable, который, похоже, делает то же самое с кодом:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/transparent" />
    <item android:drawable="?selectableItemBackgroundBorderless" />
</layer-list>

Можно ли использовать ?attr/ в <selector>?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Невозможно разрешить какие-либо ссылки в селекторах. Вот почему мы прекратили дублирование всех файлов (у нас была та же проблема с цветами и тематикой).

Возможно, вы захотите взглянуть на эти закрытые вопросы:

  1. https://stackoverflow.com/a/30757188/4310905
  2. Использование атрибутов в селекторе - Android
0 голосов
/ 17 июня 2019

LayerDrawable гибкость при использовании либо ? Attr , либо отрисовки может вводить в заблуждение. Если вы используете ? Attr , он попытается установить собственный атрибут темы, но если вы используете обычный ресурс, он попытается полностью загрузить прорисовку. Цитирование из документов LayerDrawable:

Может быть ссылкой на другой ресурс в форме "@ [+] [package:] type / name" или атрибутом темы в форме "? [Package:] type / name".

StateListDrawables * только 1017 * ожидает, что отрисовки будут ссылками как таковые:

@[package:]drawable/filename

Обратите внимание, как ? Attr или тип опущен.

Ссылка: https://developer.android.com/guide/topics/resources/drawable-resource

...