Традиционный подход полон стандартного кода и неуклюжего обращения с ресурсами.Вот почему я сделал Spyglass Framework .Чтобы продемонстрировать, как это работает, вот пример, показывающий, как создать настраиваемое представление, отображающее заголовок String.
Шаг 1. Создание настраиваемого класса представления.
public class CustomView extends FrameLayout {
private TextView titleView;
public CustomView(Context context) {
super(context);
init(null, 0, 0);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0, 0);
}
public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs, defStyleAttr, 0);
}
@RequiresApi(21)
public CustomView(
Context context,
AttributeSet attrs,
int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(attrs, defStyleAttr, defStyleRes);
}
public void setTitle(String title) {
titleView.setText(title);
}
private void init(AttributeSet attrs, int defStyleAttr, int defStyleRes) {
inflate(getContext(), R.layout.custom_view, this);
titleView = findViewById(R.id.title_view);
}
}
Шаг 2. Определениестроковый атрибут в файле ресурсов values/attrs.xml
:
<resources>
<declare-styleable name="CustomView">
<attr name="title" format="string"/>
</declare-styleable>
</resources>
Шаг 3: Примените аннотацию @StringHandler
к методу setTitle
, чтобы сообщить платформе Spyglass направлять значение атрибута этому методу, когдапредставление завышено.
@HandlesString(attributeId = R.styleable.CustomView_title)
public void setTitle(String title) {
titleView.setText(title);
}
Теперь, когда у вашего класса есть аннотация Spyglass, среда Spyglass обнаружит его во время компиляции и автоматически сгенерирует класс CustomView_SpyglassCompanion
.
Шаг 4:Используйте сгенерированный класс в методе init
пользовательского представления:
private void init(AttributeSet attrs, int defStyleAttr, int defStyleRes) {
inflate(getContext(), R.layout.custom_view, this);
titleView = findViewById(R.id.title_view);
CustomView_SpyglassCompanion
.builder()
.withTarget(this)
.withContext(getContext())
.withAttributeSet(attrs)
.withDefaultStyleAttribute(defStyleAttr)
.withDefaultStyleResource(defStyleRes)
.build()
.callTargetMethodsNow();
}
Вот и все.Теперь, когда вы создаете экземпляр класса из XML, собеседник Spyglass интерпретирует атрибуты и выполняет требуемый вызов метода.Например, если мы надуваем следующий макет, то setTitle
будет вызываться с "Hello, World!"
в качестве аргумента.
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:width="match_parent"
android:height="match_parent">
<com.example.CustomView
android:width="match_parent"
android:height="match_parent"
app:title="Hello, World!"/>
</FrameLayout>
Каркас не ограничен строковыми ресурсами, имеет множество различных аннотаций для обработки другихтипы ресурсов.Он также содержит аннотации для определения значений по умолчанию и для передачи значений заполнителей, если ваши методы имеют несколько параметров.
Посмотрите репозиторий Github для получения дополнительной информации и примеров.