2017-04-16 19 views
0

我想將EditText的值綁定到按鈕單擊上的POJO,但POJO爲空。以下是我寫的代碼: -無法使雙向數據綁定工作

MainActivity: -

public class MainActivity extends AppCompatActivity { 


    ActivityMainBinding binding; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     binding = DataBindingUtil.setContentView(this,R.layout.activity_main); 
     ButterKnife.bind(this); 
    } 

    @OnClick(R.id.button) 
    public void submit() 
    { 
     Log.d("myapplication",binding.getUser()); // NullPointerException 
    } 
} 

activity_main.xml中: -

<?xml version="1.0" encoding="utf-8"?> 

<layout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 
     <variable 
      name="user" 
      type="com.paragkadam.databindingsample.User"/> 
    </data> 


    <RelativeLayout 

     android:id="@+id/activity_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     tools:context="com.paragkadam.databindingsample.MainActivity"> 

    <EditText 
     android:id="@+id/first_name_edittext" 
     android:layout_margin="10dp" 
     android:hint="First name" 
     android:text="@={user.firstName}" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <EditText 
     android:id="@+id/last_name_edittext" 
     android:layout_margin="10dp" 
     android:hint="Last name" 
     android:text="@={user.lastName}" 
     android:layout_below="@+id/first_name_edittext" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <Button 
     android:id="@+id/button" 
     android:layout_margin="10dp" 
     android:layout_below="@+id/last_name_edittext" 
     android:text="Submit" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
    </RelativeLayout> 

</layout> 

POJO類User.java: -

public class User { 
    private String firstName,lastName; 

    public User(){} 
    public User(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
} 

回答

1

我認爲你得到NullPointerException,因爲你沒有設置用戶值。的

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     binding = DataBindingUtil.setContentView(this,R.layout.activity_main); 
     binding.setUser(new User("FirstName","LastName")); 
    } 
+0

是的空指針異常在調用setUser()方法後消失。但我的問題是 - 數據綁定庫本身不應該設置用戶pojo的值,而不是明確地調用setUser()。我期望我的edittext的價值被附加到我的pojo用戶。 –

+0

不,數據綁定不會自行設置值。你必須通過他們相應的setter方法來設置'data'標記內的所有變量值。一旦你通過'setUser()'方法傳遞'User'類的實例,它將被附加到edittext,並且你可以在'User'對象中獲得edittext的文本。 – CodeCameo

+0

那麼這是否意味着我只需要設置pojo一次,並且edittext上的文本發生更改時,模型會自動設置更新的值? –

1

首先雙向數據綁定不需要事件只是@ = {}將設置在上視圖執行的每個事件變量

其次每次你寫在數據綁定需要設置其他顯示變量檢查nullchecks 作爲binding.setuser不叫上onCreate方法也將是無效和綁定將調用 User.name將其設置在文本視圖中,這將最終導致空指針

還檢查了結合文檔 他們有設置爲 @bindable變量 以及已通知的財產已更改