2015-11-19 6 views
8

In Yigit Boyar and George Mount's talk on Android Databinding illustrano quanto sia facile eseguire il binding a TextWatcher's onTextChanged (alle 13:41). Su un pulsante. Le loro diapositive sono sbagliate? Innanzitutto la vista Button non ha una proprietà onTextChanged. Non ha nemmeno un metodo setOnTextChanged. Né lo è EditText. Ma entrambi hanno addTextChangedListener che accetta come input TextWatcher.Come eseguire il collegamento a onTextChanged per un EditText su Android?

Quindi di cosa stanno parlando? Come lo fanno? Il loro codice di esempio non viene compilato, ma dà questo errore:

Error:(17) No resource identifier found for attribute 'onTextChanged' in package 'android' 

Come faccio a legarsi ad un "testo modificato Event" in ogni caso, o EditText in particolare, con il quadro Databinding Android?

risposta

28

In realtà si risolve della scatola. Penso che il mio errore stia usando una vecchia versione del framework di associazione dei dati. Utilizzando la più recente, questa è la procedura:

Vista:

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/username" 
    android:text="Enter username:" 
    android:onTextChanged="@{data.onTextChanged}" /> 

Modello:

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    Log.w("tag", "onTextChanged " + s); 
} 

Assicurarsi di essere referncing Gradle strumenti di compilazione v1.5.0 o superiore e stata attivata l'associazione dati con android.dataBinding.enabled true nel tuo build.gradle.

modifica: Progetto dimostrativo di funzionamento here. view. model.

+4

Questa soluzione non funziona. EditText non ha un attributo onTextChanged. –

+3

@ M.Palsich funziona. https: //news.realm.io/news/data-binding-android-boyar-mount/ – Sotti

+0

Sì EditText non ha bisogno di un attributo onTextChanged perché è definito come BindingAdapter: https://android.googlesource.com/platform/frameworks/data-binding/ +/android-6.0.0_r7/extensions/baseAdapters/src/main/java/android/databinding/adattatori/TextViewBindingAdapter.java # 299. tl; dr: il binding dei dati è magico. – Nilzor

0

allegare un setOnFocusChangeListener al EditText, e utilizzare confrontare il contenuto testuale con una variabile globale (del precedente stato/contenuto del campo) per determinare se è cambiato:

mEditTextTitle.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(!hasFocus) 
       // check if text has changed  
     } 
    }); 
+0

Almeno, questo è un modo per * raggiungere * "onTextChanged", ma non è esattamente quello che stai chiedendo. La mia soluzione si attiva solo quando l'utente effettivamente * lascia * EditText. – joakimk

6

Per estendere @Nilzors risposta, è anche possibile passare il testo e/o di altri parametri nel layout:

Vista:

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/username" 
    android:text="Enter username:" 
    android:onTextChanged="@{(text, start, before, count) -> viewModel.onUsernameTextChanged(text)}" /> 

ViewModel :

public void onUsernameTextChanged(CharSequence text) { 
    // TODO do something with text 
} 

È sempre necessario passare uno zero o tutti i parametri.

Problemi correlati