2016-09-10 37 views
13

Używam aplikacji TextInputLayout w mojej aplikacji na Androida, aby osiągnąć ten efekt pływającej etykiety dla moich pól wprowadzania. Wiem, że powinienem używać także TextInputEditText, aby umożliwić wyświetlanie podpowiedzi w trybie poziomym, a dane wejściowe wypełniają cały ekran.TextInputLayout i AutoCompleteTextView

Jednak w niektórych moich polach wejściowych mam autouzupełnianie, używając AutoCompleteTextView (które IMO ma naprawdę niespójną nazwę - "TextView" zamiast "EditText" - ale to już inna historia) i to oczywiście dziedziczy bezpośrednio od EditText. W związku z tym nie ma tej samej funkcjonalności, co przynosi TextInputEditText.

Zastanawiam się, czy istnieje sposób na uzyskanie tej samej funkcji podpowiedzi w krajobrazie (bez wykonywania własnej implementacji TextInputAutoCompleteTextView), a także uniknięcie generowanych ostrzeżeń o kłaczkach. Czy coś mi umyka? Sądzę, że dostaję, że nie stworzyli niestandardowych wersji wszystkich podklas bezpośrednich i pośrednich EditText dla tej konkretnej rzeczy, więc czy spodziewam się zrobić własną?

Odpowiedz

12

Trochę za późno, ale tak, będziesz musiał wdrożyć własną implementację. Dobra wiadomość jest taka, że ​​jest to dość proste. Oto jak TextInputEditText był projekt:

https://android.googlesource.com/platform/frameworks/support.git/+/master/design/src/android/support/design/widget/TextInputEditText.java

Odpowiednio, oto co TextInputAutoCompleteTextView może wyglądać.

public class TextInputAutoCompleteTextView extends AppCompatAutoCompleteTextView { 

    public TextInputAutoCompleteTextView(Context context) { 
     super(context); 
    } 

    public TextInputAutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public TextInputAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     final InputConnection ic = super.onCreateInputConnection(outAttrs); 
     if (ic != null && outAttrs.hintText == null) { 
      // If we don't have a hint and our parent is a TextInputLayout, use it's hint for the 
      // EditorInfo. This allows us to display a hint in 'extract mode'. 
      final ViewParent parent = getParent(); 
      if (parent instanceof TextInputLayout) { 
       outAttrs.hintText = ((TextInputLayout) parent).getHint(); 
      } 
     } 
     return ic; 
    } 
} 
+0

Nigdy nie za późno, przyjacielu! Tak, myślałem tak samo. Sądzę, że widząc, że tekst TextInputEditText jest tak prosty, nie stanowi to problemu. Dzięki za twoją odpowiedź! ☺ – sindrenm