关于为诸如Edittext,TextView

时间:2019-06-20 05:51:29

标签: android xml android-edittext attributes

帮助!我想知道我们是否可以为诸如EditText,TextView,AutoCompleteTextView,MultiAutoCompleteTextView等预先存在的android组件创建自己的自定义属性。

使用XML时,我需要为autocompletetextview实现自定义属性/属性,以便在属性设置为false时不显示自动完成建议,反之亦然。

1 个答案:

答案 0 :(得分:0)

可以。有一种叫做绑定适配器的东西,您可以将它们用作新的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