使用设计支持库时 EditText getHint() returns null

EditText getHint() returns null when using design support library

将 EditText 与设计库(版本 22.2.1)TextInputLayout 结合使用时,以编程方式获取提示 returns null。

我试图以编程方式将星号“*”附加到必填字段,因此 EditText.getHint() 但它 returns null 的事实在这种情况下是一个问题。

EditText editText = (EditText) findViewById(R.id.edit2);
String hint = String.format("%s *", editText.getHint());
editText.setHint(hint);

一个简单的代码说明: Layout.xml:

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <EditText
            android:id="@+id/edit2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/hello_world"
            android:inputType="text"/>
</android.support.design.widget.TextInputLayout>

Java:

EditText editText = (EditText) findViewById(R.id.edit2);
if (editText.getHint() == null) throw new AssertionError("Hint should not be null");

依赖:编译'com.android.support:design:22.2.1'

之前的相关问题 !

这在设计支持 23.0.0 中已修复,但项目必须针对 api 23 进行编译。

build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion '23'
    ....
}
dependencies{
    compile 'com.android.support:appcompat-v7:23.0.0'
...
}

像以前一样在 EditText 上设置提示:

<android.support.design.widget.TextInputLayout
    android:id="@+id/inputField"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hello_world"
        android:inputType="text"/>

现在向提示添加一个额外的字符:

TextInputLayout inputField = (TextInputLayout) findViewById(R.id.inputLayout);
String hint = String.format("%s *", inputField.getHint());
inputField.setHint(hint);

实际上,提示移动到 EditText 视图周围的父视图 TextInputLayout

你可以得到这样的提示:

android.support.design.widget.TextInputLayout parent = (android.support.design.widget.TextInputLayout) yourEditText.getParent();
String hint = parent.getHint().toString();

如果你想添加 * 就这样:

parent.setHint(parent.getHint() + "*");

编码愉快! :)

提示与其父布局相关联

((TextInputLayout)view.getParent()).getHint()

只是您需要定位 TextInputLayout 而不是 EditText,我正在使用 Material Design

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/inputLayoutFirstName"
    ...>
    <androidx.appcompat.widget.AppCompatEditText
        ...
        android:hint="First Name"/>
</com.google.android.material.textfield.TextInputLayout>

所以基本上改变提示尝试:

inputLayoutFirstName.apply {
    hint = hint.toString().plus("*")
}

您还可以使用此扩展名:

private fun TextInputLayout.addRequiredSymbolHint() {
    hint = hint.toString().plus("*")
}