TextInputLayout не показывает подсказку EditText, прежде чем пользователь сфокусируется на ней


96

Я использую недавно выпущенную библиотеку поддержки дизайна Android, чтобы отображать плавающие метки с EditTexts. Но я столкнулся с проблемой, что подсказка в EditText не отображается при рендеринге пользовательского интерфейса, но я вижу подсказку после того, как сосредоточусь на EditTexts.

Мой макет выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <ScrollView
        android:id="@+id/ScrollView01"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin">

            <android.support.design.widget.TextInputLayout
                android:id="@+id/name_et_textinputlayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/activity_vertical_margin">

                <EditText
                    android:id="@+id/FeedBackerNameET"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/feedbackname"
                    android:inputType="textPersonName|textCapWords" />
            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:id="@+id/email_textinputlayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/FeedBackerEmailET"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/feedbackemail"
                    android:inputType="textEmailAddress" />

            </android.support.design.widget.TextInputLayout>

            <Spinner
                android:id="@+id/SpinnerFeedbackType"
                android:layout_width="fill_parent"
                android:layout_height="48dp"
                android:layout_marginTop="@dimen/activity_vertical_margin"
                android:entries="@array/feedbacktypelist"
                android:prompt="@string/feedbacktype" />

            <android.support.design.widget.TextInputLayout
                android:id="@+id/body_textinputlayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/EditTextFeedbackBody"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/feedbackbody"
                    android:inputType="textMultiLine|textCapSentences"
                    android:lines="5" />

            </android.support.design.widget.TextInputLayout>

            <CheckBox
                android:id="@+id/CheckBoxFeedBackResponse"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/activity_vertical_margin"
                android:text="@string/feedbackresponse" />

            <Button
                android:id="@+id/ButtonSendFeedback"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/activity_vertical_margin"
                android:text="@string/feedbackbutton" />
        </LinearLayout>
    </ScrollView>

</FrameLayout>

<View
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:background="@drawable/toolbar_shadow" />
</FrameLayout>

Я также попытался установить подсказку для TextInputLayoutметода использования, setHintно безуспешно .

mNameTextInputLayout = (TextInputLayout) v.findViewById(R.id.name_et_textinputlayout);
mNameTextInputLayout.setErrorEnabled(true);
mNameTextInputLayout.setHint(feedBackerNameET.getHint());

mEmailTextInputLayout = (TextInputLayout) v.findViewById(R.id.email_textinputlayout);
mEmailTextInputLayout.setErrorEnabled(true);
mEmailTextInputLayout.setHint(feedBackerEmail.getHint());

mBodyTextInputLayout = (TextInputLayout) v.findViewById(R.id.body_textinputlayout);
mBodyTextInputLayout.setErrorEnabled(true);
mBodyTextInputLayout.setHint(feedBackBody.getHint());

У меня та же проблема. К моему удивлению, запуск приложения на эмуляторе 4.1 работал нормально, но на моем включенном предварительном просмотре M Nexus TextInputLayout вел себя неправильно и не отображал подсказку для встроенного EditText.
sashomasho

Можете ли вы проверить свой цвет подсказки или попробовать изменить цвет фона вашего представления, возможно, они есть, но вы не можете видеть из-за цвета
Ultimo_m

@Ultimo_m я думаю, цвет подсказки не должен быть проблемой. Однако я постараюсь посмотреть после изменения цвета фона.
Шажил Афзал 01

1
@Shajeel Afzal Я говорю вам это предложение, потому что у меня была та же проблема, что и у вас, и когда я добавил фон в представление, я увидел подсказку. Я использую его внутри фрагмента. Я не добавил код из java, все, что я сделал, это из xml
Ultimo_m 01

2
Я вижу эту проблему при добавлении / удалении фрагментов. Но если я покажу / скрою фрагменты, я не увижу этой проблемы.
Дэйв Дженсен

Ответы:


84

Обновить:

Это ошибка, исправленная в версии 22.2.1 библиотеки.

Оригинальный ответ:

Как упоминал @shkschneider, это известная ошибка . Пользователь Github @ ljubisa987 недавно опубликовал Gist для обходного пути:

https://gist.github.com/ljubisa987/e33cd5597da07172c55d

Как отмечено в комментариях, обходной путь работает только на Android Lollipop и старше. Это не работает на Android M Preview.


1
Что ж, Android MDC - это предварительная версия.
Дэйв Дженсен

1
Кстати, похоже, что статус ошибки теперь «Будущий выпуск».
Дэйв Дженсен,

2
Комментарий № 28 здесь: code.google.com/p/android/issues/… работает для меня
J_Sizzle

1
Исправлено в версии 22.2.1.
Jdruwe

3
Мы уверены, что это исправлено в V22.2.1? У меня возникла эта проблема в библиотеке дизайна v22.2.1, работающей на Android версии 5.1.1. У меня есть два EditText на панели инструментов, на которую я перехожу к действию, и текст подсказки не отображается, пока не сфокусирован.
StuStirling

13

Это известная ошибка библиотеки Android Design. Он был принят и назначен .

Так что вы должны исправить это в следующем выпуске библиотеки Android Design.

А пока вы можете посмотреть в трекере проблем, чтобы найти исправление, которое может быть там опубликовано, но на данный момент я ничего не знаю.

И да, это касается только Lollipop и выше.


1
Эта проблема исправлена ​​в версии 22.2.1
Сэм

11

Это работает для меня в Библиотеке дизайна 23.1.1:

Установите цвет подсказки в атрибутах xml TextInputLayout:

    <android.support.design.widget.TextInputLayout
        ....
        android:layout_margin="15dp"
        android:textColorHint="@color/hintColor"
        android:layout_width="match_parent"
        ...

свойство textColorHint также исправило это для меня.
JoM


5

вы должны использовать android.support.v7.widget.AppCompatEditTextкак EditTextи установить, android:hintкак показано ниже

<android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <android.support.v7.widget.AppCompatEditText
                android:id="@+id/etx_first_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"                    
                android:inputType="text"
                android:hint="@string/hint_first_name"/>
    </android.support.design.widget.TextInputLayout>

3
   <android.support.design.widget.TextInputLayout
            android:id="@+id/editText1"
            android:layout_margin="15dp"
            android:layout_centerVertical="true"
            android:layout_width="match_parent"

            android:layout_height="wrap_content">

              <AutoCompleteTextView
                android:id="@+id/editText"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:singleLine="true"
                android:hint="Add City" />

          </android.support.design.widget.TextInputLayout>

Используйте этот фрагмент кода. Убедитесь, что ваша активность - AppCompatActivity. И зависимость также от последних версий

compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:design:22.2.0'

Обновите студию Android до последней версии. см. вывод здесь


3

Если вы устанавливаете подсказку EditText программно, это не сработает! Вам нужно установить подсказку для TextInputLayout самостоятельно.

TextInputLayout textInputLayout = (TextInputLayout) findViewById(R.id.usernameTextInputLayout);
textInputLayout.setHint(getString(R.string.username_hint));

Вот XML, если вам интересно:

        <android.support.design.widget.TextInputLayout
            android:id="@+id/usernameTextInputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.AppCompatEditText
                android:id="@+id/usernameEt"
                android:layout_width="match_parent"
                android:layout_height="@dimen/default_height"
                android:layout_marginEnd="@dimen/default_margin"
                android:layout_marginStart="@dimen/default_margin"
                android:maxLength="@integer/username"
                tools:hint="Username" />

        </android.support.design.widget.TextInputLayout>

3

Эта проблема решена в v23.0.1библиотеке поддержки дизайна. Я также обновил свои appcompat-v7to 23.0.1, compileSdkVersionto 23и buildToolsVersionto 23.0.1в build.gradle .

android {    
compileSdkVersion 23
buildToolsVersion "23.0.1"
}

dependencies {
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
}

Нужно ли менять CompleteSdkVersion, версию buildtools и appCompatVersion при изменении версии поддержки дизайна ??
srinivas 03

Это происходит потому, что «библиотеки поддержки» v23 требуют API23 для компиляции проекта. Таким образом, основная связь существует между «библиотеками поддержки» и «compileSdkVersion». Вы всегда должны соответствовать compileSdkVersion, даже если targetSdkVersion или minSdkVersion ниже. Причина проста, версия библиотеки отражает версию Android sdk, против которой она была создана.
Вахиб Уль Хак

2

Я решил свою проблему с помощью этого кода:

new Handler().postDelayed(
        new Runnable() {
            @Override
            public void run() {
                TextInputLayout til = (TextInputLayout) someParentView.findViewById(R.id.til);
                til.setHint("Your Hint Text");
                til.bringToFront();
            }
        }, 10);

Ключевым моментом здесь является расширение bringToFront. Он заставляет TextInputLayoutповторно рисовать, что не то же самое, что и выполнение invalidate(). Если вы пытаетесь отобразить TextInputLayoutна a, viewкоторый имеет animationsили tranistions, вам необходимо выполнить приведенный выше код в конце animationили transition. Просто убедитесь, что приведенный выше код работает в пользовательском интерфейсе thread.


0

Похоже, эта проблема появляется, когда вы устанавливаете onFousListener на EditText - попробуйте расширить EditText и поддержать несколько onFocusListener



0

Проблема решена: перейдите к build.gradle вашего приложения и проверьте библиотеку дизайна. compile 'com.android.support:design:22.2.1' Он должен быть 22.2.1 или новее.


0

Проблема в цвете подсказки. При наборе текста он становится белым. Измените цвет подсказки или цвет фона. Вы увидите подсказку при вводе.


0

Есть простое решение, так как это сработало для меня

<android.support.design.widget.TextInputLayout
    android:id="@+id/activity_login_til_password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="27dp"
    android:layout_marginTop="24dp"
    android:padding="10dp"
    app:passwordToggleEnabled="true"
    app:passwordToggleTint="#000000"
    app:passwordToggleDrawable="@drawable/passwordviewtoggleselector"
    android:theme="@style/Base.TextAppearance.AppCompat">
      <!---- add this line and theme as you need ----->
    <android.support.design.widget.TextInputEditText
        android:id="@+id/activity_login_et_password"
        android:layout_width="match_parent"
        android:layout_height="58dp"
        android:hint="Password"
        android:inputType="textPassword"
        android:padding="10dp"
        android:textColor="#f5ab3a"
        android:textColorHint="#e6d2d1cf"
        android:textSize="20dp" />

</android.support.design.widget.TextInputLayout>

Просто добавьте android: theme = "@ style / Base.TextAppearance.AppCompat" в TextEditLayout, и он должен работать, и вы можете изменить тему по своему усмотрению .



0

Я нашел кое-что другое.

При установке стиля для fragment,

f1.setStyle(DialogFragment.STYLE_NO_FRAME,android.R.style.Theme_DeviceDefault_Light);

Ошибка исчезла, когда я попробовал разные стили, кроме "Theme_DeviceDefault_Dialog".

Попробуйте.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.