О создании собственных атрибутов для уже существующих виджетов, таких как Edittext, TextView - PullRequest
1 голос
/ 20 июня 2019

Помощь! Я хочу знать, можем ли мы создать собственные пользовательские атрибуты для уже существующих компонентов Android, таких как EditText, TextView, AutoCompleteTextView, MultiAutoCompleteTextView и т. Д.

Используя XML, мне нужно реализовать пользовательский атрибут / свойство для autocompletetextview, чтобы в нем не отображались предложения автозаполнения, если для свойства установлено значение false, и наоборот.

1 Ответ

0 голосов
/ 20 июня 2019

Да, вы можете.Есть такая вещь, которая называется связывающими адаптерами, и вы можете использовать их как новые атрибуты 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...