Да, вы можете.Есть такая вещь, которая называется связывающими адаптерами, и вы можете использовать их как новые атрибуты xml.Ну, конечно, вы должны включить привязку данных в вашем проекте, чтобы заставить работать адаптеры привязки.
Подробнее здесь: https://developer.android.com/topic/libraries/data-binding/binding-adapters
Бонус: Если выиспользуя kotlin, вы можете вместо этого превратить эти адаптеры привязки в функции расширения, чтобы вы могли использовать их в качестве функции расширения для ваших объектов.
Обновление
В атрибуты xmlдля уже существующих виджетов сначала необходимо определить пользовательский адаптер привязки.Вот пример нестандартного адаптера привязки:
// This will change the text views background color and text when it is tapped
@BindingAdapter("changeBackgroundAndTextOnTap")
public static void changeBackgroundAndTextOnTap(final TextView view, boolean shouldChange) {
// The first parameter is the type of view this xml attribute will be available to
// The second is the value you will receive from the xml attribute
if (shouldChange) {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
view.setBackgroundColor(Color.HSVToColor(new float[]{(int)Math.round(Math.random() * 360), 0.8f, 0.4f}));
view.setText("" + (Math.random() * 10000000000L));
}
});
}
}
Но прежде чем мы сможем использовать это, мы должны сначала сказать android, что мы используем привязку данных, поэтому в файле build.gradle уровня приложения добавьте этострока:
android {
...
dataBinding {
enabled true
}
...
}
Далее, чтобы привязка данных работала с вашими XML-файлами, вы сначала должны обернуть свои макеты внутри тегов, например:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Don't Click Me!"
android:gravity="center"
android:textSize="32sp"
android:padding="24dp"
android:textColor="#dedede"
android:background="#000000"
tools:context=".MainActivity" />
</layout>
Затем в своей деятельностиили фрагмент, вы должны установить представление содержимого, используя утилиту привязки данных:
private ActivityMainBinding mBinding; //Optional
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
}
Теперь, когда все готово, вы можете теперь использовать свой собственный атрибут xml, иначе адаптер привязки данных, в ваших макетах, например так:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Don't Click Me!"
android:gravity="center"
android:textSize="32sp"
android:padding="24dp"
android:textColor="#dedede"
android:background="#000000"
changeBackgroundAndTextOnTap="@{true}" // Note: the @{} is necessary
tools:context=".MainActivity" />
</layout>
Для примера проекта вот репозиторий github: https://github.com/jianastrero/Android-Data-Binding-Example-In-Java