2015-07-10 40 views
4

我想幫助解決問題。Android數據綁定不能正常工作

首先,下面我的代碼的細節:

build.gradle (Project: android) 

buildscript { 
    repositories { 
     jcenter() 
     mavenCentral() 
     maven { url '/home/melti/java/repository' } 
    } 
    dependencies { 
     classpath "com.android.tools.build:gradle:1.3.0-beta4" 
     classpath "com.android.databinding:dataBinder:1.0-rc0" 

    } 
} 

allprojects { 
    repositories { 
     jcenter() 
     mavenCentral() 
     maven { url '/home/melti/java/repository' } 

    } 
} 

的build.gradle(模塊:APP)

apply plugin: 'com.android.application' 
apply plugin: 'com.android.databinding' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "23.0.0 rc2" 

    defaultConfig { 
     applicationId "br.com.soma" 
     minSdkVersion 16 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.0.0' 
    compile 'com.android.support:recyclerview-v7:21.0.3' 
    compile 'com.android.support:cardview-v7:21.0.3' 
    compile 'com.squareup.picasso:picasso:2.5.2' 
    compile 'com.squareup.okhttp:okhttp:2.4.0' 
    compile 'com.google.code.gson:gson:2.3.1' 
    compile 'org.springframework:spring-core:4.1.7.RELEASE' 
    compile 'org.apache.commons:commons-io:1.3.2' 


} 

AmanteEditModel

package br.com.soma.amante.edit; 

import android.databinding.BaseObservable; 
import android.databinding.Bindable; 

import br.com.soma.BR; 

/** 
* Created by spassu on 09/07/15. 
*/ 
public class AmanteEditModel extends BaseObservable { 

    private String senhaConfirm; 



    @Bindable 
    public String getSenhaConfirm() { 
     return senhaConfirm; 
    } 

    public void setSenhaConfirm(String senhaConfirm) { 
     this.senhaConfirm = senhaConfirm; 
     notifyPropertyChanged(BR.senhaConfirm); 
    } 
} 

fragment_amante_edit

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto"> 

    <data> 
     <variable name="model" type="br.com.soma.amante.edit.AmanteEditModel"/> 
    </data> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <android.support.v7.widget.CardView 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      style="@style/card_edit_style" 
      android:layout_gravity="top" 
      card_view:cardCornerRadius="0dp"> 


        <EditText 
         android:id="@+id/amante_edit_senha_confirm" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_gravity="center_vertical" 
         android:hint="Confirme a senha" 
         android:inputType="textPassword" 
         android:maxLines="1" 
         android:text="@{model.senhaConfirm}" 
        /> 

     </android.support.v7.widget.CardView> 

    </ScrollView> 
</layout> 

AmanteEditFragment

package br.com.soma.amante.edit; 

import android.app.Fragment; 
import android.databinding.DataBindingUtil; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

import br.com.soma.R; 
import br.com.soma.amante.view.AmanteViewActivity; 
import br.com.soma.databinding.FragmentAmanteEditBinding; 

/** 
* Created by spassu on 27/05/15. 
*/ 
public class AmanteEditFragment extends Fragment { 

    private AmanteEditModel model; 

    private static final String AMANTE_ID = "amanteId"; 
    public static final String DEFAULT_FRAGMENT_TAG = "amanteEditFragment"; 

    // Views 
    private long amanteId; 

    public AmanteEditFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     model = new AmanteEditModel(); 
     FragmentAmanteEditBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_amante_edit, container, false); 
     binding.setModel(model); 
     return binding.getRoot(); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.menu_amante_edit, menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch(item.getItemId()) { 
      // The Save button was pressed 
      case R.id.menu_amante_edit_save: 
       save(); 
       getActivity().finish(); 
       return true; 
      } 
     return super.onOptionsItemSelected(item); 
    } 


    public static AmanteEditFragment newInstance(long id) { 
     AmanteEditFragment fragment = new AmanteEditFragment(); 
     Bundle args = new Bundle(); 
     args.putLong(AmanteViewActivity.EXTRA_AMANTEID, id); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    private void save() { 
     Toast.makeText(getActivity(), model.getSenhaConfirm(), Toast.LENGTH_SHORT).show(); 
    } 
} 

senhaConfirm輸入數據,然後點擊save()後,我發現,綁定不工作,也就是senhaConfirmAmanteEditModel爲空呢。誰能幫我?

+0

最新錯誤?你在哪裏設置模型數據的值 – 3xplore

+0

它不會發生錯誤,但綁定不起作用。因爲我使用的是數據綁定,所以在EditText中輸入的文本應該注入模型中的setSenhaConfirm。我是對的? – araraujo

+0

不,其他方式 – 3xplore

回答

4

編輯:根據雷米大衛Android Studio現在功能雙向數據綁定。我在下面描述的解決方案應該不再是必要的。

感謝Remi指出了這一點。


關於用戶輸入Android Databinding只是一種方法。 GUI將自動反映模型中的任何變化,但反之亦然。

您需要將TextChangeListener添加到您的模型類,該類將在用戶更改任何內容時設置模型屬性。

例子:

public class AmanteEditModel extends BaseObservable { 

    private String senhaConfirm; 

    @Bindable 
    public String getSenhaConfirm() { 
     return senhaConfirm; 
    } 

    public void setSenhaConfirm(String senhaConfirm) { 
     this.senhaConfirm = senhaConfirm; 
     notifyPropertyChanged(BR.senhaConfirm); 
    } 

    // Textwatcher Reference: http://developer.android.com/reference/android/text/TextWatcher.html 
    public TextWatcher getMyEditTextWatcher() { 
     return new TextWatcher() { 

      public void afterTextChanged(Editable s) { 
      } 

      public void beforeTextChanged(CharSequence s, int start, 
              int count, int after) { 
      } 

      public void onTextChanged(CharSequence s, int start, 
            int before, int count) { 
       // Important! Use the property setter, otherwhise the model won't be informed about the change. 
       setSenhaConfirm(s); 
      } 
     }; 
    } 

} 

在你的佈局XML改變的EditText這樣:

<EditText 
    android:id="@+id/amante_edit_senha_confirm" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:hint="Confirme a senha" 
    android:inputType="textPassword" 
    android:maxLines="1" 
    android:text="@{model.senhaConfirm}" 
    app:addTextChangeListener="@{model.myEditTextWatcher}" 
    /> 

手錶addTextChangeListener的命名空間。此方法可能無法通過android:命名空間獲得,所以我正在使用app:here。您也可以使用bind:使綁定更清晰。

所以千萬不要錯過

xmlns:app="http://schemas.android.com/apk/res-auto" 

xmlns:bind="http://schemas.android.com/apk/res-auto" 

添加到您的XML命名空間。

此解決方案適用於所有輸入控件,包含自定義,因爲您在模型中提供了正確的聽衆。

TextWatcher Reference

+0

也許AngularJS(自動雙向綁定)已經毀了我,但我只是希望它是雙向綁定。更多代碼。更多的工作。哎呀!非常好的解決方案。我能夠在我的代碼中實現它。謝謝。 – raddevus

+0

@daylight很高興我可以幫忙:-) –

+1

它即將通過https://halfthought.wordpress.com/2016/03/23/2-way-data-binding-on-android/ –