2016-04-18 10 views
6

ho creato una schermata di login semplice utilizzando l'associazione dati come descritto al http://developer.android.com/tools/data-binding/guide.html tuttavia non sono in grado di ottenere la notifica di testo cambiato dadati Android vincolante - in grado di richiamare il click handler

  1. la casella di testo o
  2. il pulsante clic.

Ogni aiuto è apprezzato

Credo che per la notifica casella di testo, il team di Android potrebbe non hanno attuato completamente. Tuttavia, non riesco a capire il mio errore per il gestore di clic del pulsante.

Il frammento di codice si presenta come

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    FragmentAccountSetupInitialBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_account_setup_initial, container, false); 
    View view = binding.getRoot(); 

    binding.setAccount(new UserAccount()); 
    return view; 
} 

Il ViewModel per conto utente è come definito di seguito

public class UserAccount extends BaseObservable { 
    private String _email; 
    private String _password; 

    @Bindable 
    public String getEmail() { 
     return _email; 
    } 

    public void setEmail(String email) { 
     if(!TextUtils.equals(_email, email)) { 
      _email= email; 
      notifyPropertyChanged(BR.email); 
     } 
    } 


    @Bindable 
    public String getPassword() { 
     return _password; 
    } 

    public void setPassword(String password) { 
     if(!TextUtils.equals(_password, password)) { 
      _password = password; 
      notifyPropertyChanged(BR.password); 
     } 
    } 

    public void onSignInButtonClick(View view) { 
     // Sign in now 
    } 
} 

E il layout frammento è

<layout 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="account" type="project.namespace.UserAccount"/> 
    </data> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingTop="56dp" 
      android:paddingLeft="24dp" 
      android:paddingRight="24dp"> 

      <!-- Email Label --> 
      <android.support.design.widget.TextInputLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="8dp" 
       android:layout_marginBottom="8dp"> 
       <android.support.design.widget.TextInputEditText 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:inputType="textEmailAddress" 
        android:hint="@string/email" 
        android:text="@{account.email}"/> 
      </android.support.design.widget.TextInputLayout> 

      <!-- Password Label --> 
      <android.support.design.widget.TextInputLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="8dp" 
       android:layout_marginBottom="8dp"> 
       <android.support.design.widget.TextInputEditText 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:inputType="textPassword" 
        android:hint="@string/password" 
        android:text="@{account.password}"/> 
      </android.support.design.widget.TextInputLayout> 


      <android.support.v7.widget.AppCompatButton 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="24dp" 
       android:layout_marginBottom="24dp" 
       android:padding="12dp" 
       android:text="@string/signin" 
       android:onClick="@{account.onSignInButtonClick}"/> 

     </LinearLayout> 

    </FrameLayout> 
</layout> 

Aggiornamento

Passare a Android Studio 2.1 beta 2 risolve il primo problema. Aggiornato il layout come segue

<android.support.design.widget.TextInputEditText 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:inputType="textEmailAddress" 
    android:hint="@string/email" 
    android:text="@={account.email}"/> 
+0

passare questo link [onClick Handler] (http://stackoverflow.com/questions/31961901/using-databinding-library-for-binding-events) è possibile trovare la soluzione per questa domanda. –

+0

Penso che sia esattamente quello che sto facendo. Invece di una classe MyHandler separata, la gestisco nella classe UserAccount. – resp78

+1

Il binding dei dati è "solo andata", al momento. Pertanto, solo le modifiche nel modello comunicano la vista, non il contrario. Questa è una funzionalità che viene fornita con 'Android Studio 2.1' ([Source] (https://halfthought.wordpress.com/2016/03/23/2-way-data-binding-on-android/?utm_source=androiddevdigest). Il tuo codice sembra a posto, potresti spiegare di più il tuo problema? Si chiama il metodo 'onClick'? – yennsarah

risposta

1

Come ho conosciuto, l'evento onClick non sembra lavorare in frammento e non mi why.Try utilizzare BindingAdapter annotazioni per definire setter personalizzato.

+0

sì, lo stesso qui. – beerBear

2

Puoi provare quanto segue per il tuo pulsante?

<android.support.v7.widget.AppCompatButton 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="24dp" 
      android:layout_marginBottom="24dp" 
      android:padding="12dp" 
      android:text="@string/signin" 
      android:onClick="@{account::onSignInButtonClick}"/> 

ottengo un errore sul IDE ('!=', '%'... expected, got ':') ma funziona quando l'applicazione è in esecuzione ... La parte importante è il "::".

Spero che questo ti aiuti!

Problemi correlati