0

私はAndroid Data Binding Library、MVVM、Retrofitを使用しました。AndroidデータバインディングライブラリとMVVMを使用してアプリケーションを開発するには?

"employeeid"と "password"と呼ばれる2つのフィールドがあります。ログインボタンをクリックすると、私はこれらの値が必要です。 LoginViewModelにButtonイベントを記述しました。ログインボタンをクリックすると、null値が返されます。私に何ができる?

データバインディングライブラリとMVVMを間違えた場合。あなたはそれを言いたいことがありますか?

public void onClickLogin(View view) { 
     LoginViewModel loginViewModel=new LoginViewModel(mContext); 

     String EmpId=loginViewModel.getEmployeeid(); 
     String Pass=loginViewModel.getPassword(); 


     Toast.makeText(mContext, "EmployeeID is:"+EmpId+"Password is:"+Pass, Toast.LENGTH_LONG).show(); 

    } 

モデル - ログイン:

public class Login { 

    @SerializedName("EmpID") 
    private String employeeid; 
    @SerializedName("FullName") 
    private String fullname; 
    @SerializedName("UserType") 
    private String usertype; 

    String password; 

    public Login(String employeeid, String fullname, String usertype, String password) { 
     this.employeeid = employeeid; 
     this.fullname = fullname; 
     this.usertype = usertype; 
     this.password = password; 
    } 

    public String getEmployeeid() { 
     return employeeid; 
    } 

    public void setEmployeeid(String employeeid) { 
     this.employeeid = employeeid; 
    } 

    public String getFullname() { 
     return fullname; 
    } 

    public void setFullname(String fullname) { 
     this.fullname = fullname; 
    } 

    public String getUsertype() { 
     return usertype; 
    } 

    public void setUsertype(String usertype) { 
     this.usertype = usertype; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

} 

LoginViewModel:

public class LoginViewModel extends BaseObservable { 

    private Login mLogin; 
    private String employeeid; 
    private String password; 
    private String fullname; 
    private Context mContext; 

    String TAG= LoginActivity.class.getSimpleName(); 

    public LoginViewModel(Context mContext) { 
     this.mContext = mContext; 
    } 


    @Bindable 
    public String getEmployeeid() { 
     return employeeid; 
    } 

    public void setEmployeeid(String employeeid) { 
     this.employeeid = employeeid; 
     notifyPropertyChanged(BR.employeeid); 
    } 

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

    public void setPassword(String password) { 
     this.password = password; 
     notifyPropertyChanged(BR.password); 
    } 

    //@Bindable 
    public String getFullname() { 
     return fullname; 
    } 

    public void setFullname(String fullname) { 
     this.fullname = fullname; 
     //notifyPropertyChanged(BR.fullName); 
    } 





    public void onClickLogin(View view) { 
     LoginViewModel loginViewModel=new LoginViewModel(mContext); 

     String EmpId=loginViewModel.getEmployeeid(); 
     String Pass=loginViewModel.getPassword(); 


     Toast.makeText(mContext, "EmployeeID is:"+EmpId+"Password is:"+Pass, Toast.LENGTH_LONG).show(); 

    } 

} 

LoginActivity:

public class LoginActivity extends AppCompatActivity { 
    Login gg; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.activity_login); 
     ActivityLoginBinding binding=DataBindingUtil.setContentView(this,R.layout.activity_login); 

     LoginViewModel lvm=new LoginViewModel(this); 
     //lvm.setFullName("Durlove Roy"); 
     binding.setLoginVM(lvm); 
     binding.setLoginActivity(this); 


    } 
} 

activity_login.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" 
    android:id="@+id/activity_login"> 

    <data> 
     <variable 
      name="loginVM" 
      type="com.nitolniloygroup.operating.viewmodel.LoginViewModel"></variable> 
     <variable 
      name="loginActivity" 
      type="com.nitolniloygroup.operating.view.activity.LoginActivity"></variable> 
    </data> 


    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true"> 

     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:inputType="textPersonName" 
      android:text="@={loginVM.employeeid}" 
      android:ems="10" 
      android:id="@+id/editText" /> 

     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:inputType="textPassword" 
      android:text="@={loginVM.password}" 
      android:ems="10" 
      android:id="@+id/editText2" /> 

     <Button 
      android:text="Login" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:onClick="@{loginVM::onClickLogin}" 
      android:id="@+id/button" /> 
    </LinearLayout> 


</layout> 

答えて

0

問題はここにある:

public void onClickLogin(View view) { 
    LoginViewModel loginViewModel=new LoginViewModel(mContext); 

    String EmpId=loginViewModel.getEmployeeid(); 
    String Pass=loginViewModel.getPassword(); 


    Toast.makeText(mContext, "EmployeeID is:"+EmpId+"Password is:"+Pass, Toast.LENGTH_LONG).show(); 

} 

あなたは新しいLoginViewModelをインスタンス化する代わりに、既存のものを使用しています。これを代わりに行う:

public void onClickLogin(View view) { 
    Toast.makeText(mContext, "EmployeeID is:" + this.employeeid 
     + " Password is:" + this.password, Toast.LENGTH_LONG).show(); 
} 

また、バインディング式のパラメータとして渡すこともできます。

<Button 
     android:text="Login" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:onClick="@{() -> loginVM.onClickLogin(loginVM.employeeid, loginVM.password)}" 
     android:id="@+id/button" /> 

そして、クリックハンドラは次のようになります:

public void onClickLogin(String empId, String pwd) { 
    Toast.makeText(mContext, "EmployeeID is:" + empId 
     + " Password is:" + pwd, Toast.LENGTH_LONG).show(); 
} 
+0

ありがとうございましたボタンのイベントハンドラは、ビューモデルとは異なるクラスである場合に便利です。できます。 –

関連する問題