Android
67
Создав определение пользовательского свойства, на него можно сослаться
в макете XML своего компонента:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/resauto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello world!"
app:borderColor="#FFFF9900" />
Затем нужно получить значение этого атрибута во время создания пред
-
ставления. Для этого приходится использовать малопонятный код. Взгляните
на следующий пример, который поможет вам понять то, что сложно объяснить
на простом языке:
Java
public BottomBorderTextView(Context context,
@Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.BottomBorderTextView,
0, 0);
try {
int color = a.getBoolean(R.styleable.BottomBorderTextView_borderColor,
Color.BLACK);
setBorderColor(color);
} finally {
a.recycle();
}
}
Kotlin
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) :
super(context, attrs, defStyleAttr) {
val a = context.theme.obtainStyledAttributes(attrs,
R.styleable.BottomBorderTextView, 0, 0)
try {
borderColor = a.getInt(R.styleable.BottomBorderTextView_borderColor, Color.BLACK)
} finally {
a.recycle()
}
}
}
Откуда взялось это:
R.styleable.BottomBorderTextView
? А это:
R.styleable.Bot
tomBorderTextView_borderColor
? Ответ прост: магия. Система творит волшебство
68
Пользовательские компоненты
за кулисами, но вы можете быть уверены, что, создав ресурс XML, как было
показано выше, вы получите эти значения в глобальном экземпляре
R
. Узел
declarestyleable
генерирует имя из своего атрибута
name
и затем добавляет
в конец символ подчеркивания и значение атрибута
name
вложенного узла
attr
.
Тип
TypedArray
тоже немножко волшебный, и мы очень сомневаемся, что вам
когда-либо доведется использовать
context.getTheme().obtainStyledAttributes
в других ситуациях. Как обычно, мы рекомендуем обратиться к документации
для разработчиков, а также заглянуть в исходный код, но в данном случае (как
это характерно для операций компиляции на уровне платформы) мы призы
-
ваем вас просто довериться нам.
Возможно, вы захотите завернуть эту пользовательскую логику обработки атрибу
-
та в метод
initialize
и вызывать его в каждом конструкторе своего представле
-
ния, или можно использовать удобный трюк, вызывая каждый конструктор уров
-
нем выше со значениями по умолчанию или
null
.
iOS
Настроить свое представление в iOS и добавить его в сцену можно в раскадров
-
ке или непосредственно в файле XIB в XCode. К сожалению, подобный подход
быстро становится неустойчивым из-за сложности повторного использования
такого представления. Как правило, под «пользовательским представлением»
в iOS подразумевается пользовательский класс, который наследует стандартный
класс представления из iOS. Такие представления часто можно использовать
повторно, и они, как правило, обладают более широкими функциональными
возможностями, чем при соблюдении принципа единственной ответственно
-
сти и непосредственном добавлении этих возможностей в контроллер пред
-
ставления. Давайте поближе познакомимся с некоторыми приемами создания
пользовательских представлений в iOS и с использованием UIKit.
Do'stlaringiz bilan baham: