Dodany EditText nie jest TextInputEditText. Przełącz się na używanie tej klasy

94

Używam EditTextwewnątrz a TextInputLayout, ale po uaktualnieniu biblioteki obsługi do 23.2.0, pojawia się ostrzeżenie w logcat, Jaka jest różnica między zwykłym EditTexta TextInputEditText? Nie mogę znaleźć żadnej dokumentacji do tego.

Silvia H.
źródło
Zaktualizowałem bibliotekę pomocy technicznej do wersji 23.2.1, ale nadal nie można rozwiązać TextInputEditText w moim kodzie . jak to rozwiązałeś?
Edijae Crusar

Odpowiedzi:

110

Ja też się nad tym zastanawiałem, Daniel Wilson zebrał dokumentację, ale dla niewprawnego oka nie znaczy to wiele. Oto, o co w tym wszystkim chodzi: „tryb wyodrębniania” odnosi się do typu widoku, który jest wyświetlany, gdy przestrzeń jest zbyt mała, na przykład krajobraz na telefonie. Używam Galaxy S4 z klawiaturą Google jako edytora metody wprowadzania (IME).

Poziomy interfejs użytkownika bez widocznego edytora IME

W oparciu o fokus (na opisie) możesz zobaczyć TextInputLayoutw akcji wypychanie wskazówki poza edytor. Nie ma tu nic specjalnego, tak TextInputLayoutpowinno być.

Poziomy interfejs użytkownika bez widocznego edytora IME

Pozioma edycja interfejsu użytkownika puste pole Nazwa

Podczas edycji nazwy widać, że edytor IME nie podpowiada, co edytujesz.

Pozioma edycja interfejsu użytkownika puste pole Nazwa

Pozioma edycja interfejsu użytkownika puste pole Opis

Podczas edycji opisu widać, że edytor IME podpowiada, co edytujesz.

Pozioma edycja interfejsu użytkownika puste pole Opis

Układ XML

Różnica pomiędzy tymi dwoma polami jest ich typ EditTextVS TextInputEditText. Ważną rzeczą jest to, że TextInputLayoutma android:hintzawinięty tekst EditText, a nie opakowany, tak jest w przypadku, gdy TextInputEditTextkilka wierszy kodu Java robi dużą różnicę.

Pole nazwy

<android.support.design.widget.TextInputLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Item Name"
    >
    <EditText
        android:id="@+id/name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
</android.support.design.widget.TextInputLayout>

Pole opisu

<android.support.design.widget.TextInputLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Item Description"
    >
    <android.support.design.widget.TextInputEditText
        android:id="@+id/description"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:minLines="4"
        android:scrollbars="vertical"
        />
</android.support.design.widget.TextInputLayout>
TWiStErRob
źródło
3
Zaktualizowałem bibliotekę pomocy technicznej do wersji 23.2.1, ale nadal nie można rozwiązać TextInputEditText w moim kodzie. jak to rozwiązałeś?
Edijae Crusar
Czy masz również bibliotekę projektów? To nie jest obsługiwane.
TWiStErRob
1
Szybka uwaga: zgodnie z dokumentacją android:hintnieruchomość ma wejść TextInputEditTextzamiast TextInputLayout.
DriesOeyen
1
@luxsypher skończyło się na tym, że upuściłem go i użyłem innego sposobu, czyli umieszczenia EditText w TextInputLayout
Edijae Crusar
1
@ jeet.chanchawat to upcast, więc jest bezpieczne. Należy zawsze używać najbardziej ogólnego typu, który zapewnia potrzebną funkcjonalność (= API). Używanie TextInputEditTextto szczegół implementacji interfejsu użytkownika.
TWiStErRob
35

Nie ma do tego dokumentacji, ale klasa jest regularna EditTextz jedną dodatkową funkcją:

Użycie tej klasy pozwala nam wyświetlać wskazówkę w edytorze IME w trybie „wyodrębniania”.

W szczególności ustawia EditorInfo.hintText. W TextInputLayoutklasie zauważysz, że możesz określić wskazówkę i jej wygląd, a nie jako część EditTextwidżetu podrzędnego .

Jeśli musisz to zrobić, powinieneś użyć TextInputEditTextznaku, który zwraca uwagę na informacje podpowiedzi, które podałeś w TextInputLayout.

Daniel Wilson
źródło
2
jakiś przykład? Nie mam pojęcia, co sugerujesz
behelit
4

Zasadniczo są tym samym, ale myślę, że TextInputEditTextma więcej funkcji i być może atrybutów. Zmieniłem na TextInputEditTexti wszystko działało i wyglądało tak, jak wcześniej ze standardem EditText.

Nick Mowen
źródło
Używam już TextInputLayout, pytam o alternatywę dla EditText o nazwie TextInputEditText
Silvia H
Przepraszam, mówiłem o TextInputEditText, ale wspomniany układ. Zredagowałem odpowiedź
Nick Mowen
0

Jedyną różnicą jest to, że gdy urządzenie jest w trybie poziomym, TextInputEditTextpokaże wskazówkę, EditTextnie.

Sam Chen
źródło
-3

Miałem ten problem i właśnie usunąłem ten wiersz w moim pliku xml:

android: fitsSystemWindows = "true"

i błąd zniknął.

Santos Rodriguez
źródło