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

У меня есть собственное представление, которое расширяет один из классов фреймворка. Для большинства View в Android определены некоторые атрибуты по умолчанию (например, Button кликабельно, что задается android:clickable="true").

Как предоставить значения по умолчанию для всего приложения для моего пользовательского представления?


person Karakuri    schedule 17.05.2012    source источник
comment
stackoverflow.com/ вопросы/2695646/   -  person User    schedule 17.05.2012
comment
Я не спрашиваю о том, как определить пользовательские атрибуты. Я уже делаю это. Я хочу, чтобы для этих атрибутов были определены некоторые значения по умолчанию, чтобы представление можно было добавить в файл макета без необходимости устанавливать дополнительные свойства.   -  person Karakuri    schedule 17.05.2012


Ответы (3)


Я решил свою проблему таким образом:

res/values/attrs.xml:

<resources>
    <attr name="customViewStyle" type="reference" />
</resources>

res/values/styles.xml:

<resources>
    <style name="AppTheme" parent="@android:style/Theme.Light">
        <item name="android:background">@drawable/bg_light</item>
        <item name="customViewStyle">@style/CustomView</item>
    </style>

    <style name="CustomView">
        <item name="android:clickable">true</item>
        <item name="android:focusable">true</item>
        <item name="android:focusableInTouchMode">true</item>
    </style>
</resources>

Затем все, что вам нужно сделать, это установить тему в манифесте на AppTheme. Это также работает со стандартными виджетами, использующими android:[widget]Style вместо customViewStyle в определении AppTheme.

person Karakuri    schedule 22.05.2012
comment
Как это применимо к вашему представлению? Где customViewStyle связан с вашей реализацией View? - person cottonBallPaws; 13.11.2015
comment
@cottonBallPaws, следующее указало мне правильное направление: stackoverflow.com/a/31505624/5166250 - person Travis; 19.11.2015

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

источник: http://developer.android.com/guide/topics/resources/style-resource.html

person soost    schedule 17.05.2012
comment
Использование тега стиля — это просто ярлык для установки отдельных атрибутов в файле макета — это не то, чего я пытаюсь достичь. Я хочу иметь внешний вид/атрибуты по умолчанию, а затем тот, кто использует мое пользовательское представление, может использовать тег стиля для его дальнейшего изменения. Подумайте об этом так: когда вы добавляете TextView в макет, у него есть значения по умолчанию для размера текста, цвета текста и т. д. Они должны откуда-то браться, потому что вам не нужно указывать стиль или что-то еще. Атрибуты, которые вы изменяете, или стиль, на который вы ссылаетесь, будут применяться вместо этих значений по умолчанию. - person Karakuri; 17.05.2012

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

РЕДАКТИРОВАТЬ: Еще проще, просто вызовите конструктор подкласса View setClickable и т. д., чтобы изменить значения по умолчанию на то, что вы хотите.

person Lawrence D'Oliveiro    schedule 18.05.2012
comment
Это то, что я сделал изначально. Проблема в том, что если другой разработчик использует мое пользовательское представление и помещает clickable=false в свой xml, то мой вызов setClickable() подрывает его программирование. (Возможно, он планирует сделать его активным только после того, как пользователь что-то сделает, например, установит флажок.) Хотя я ожидаю, что на него можно будет кликнуть, другие могут этого не делать, поэтому я хотел бы предоставить некоторые поведение по умолчанию, не прибегая к подобным внутренним вызовам. В противном случае мне нужен способ прочитать все атрибуты представления, а не только пользовательские, которые я определил в attrs. - person Karakuri; 18.05.2012