MVVM片段中的OnClick按钮不起作用

时间:2020-02-05 11:32:38

标签: android android-fragments android-button android-mvvm

我有一个LoginActivity,其中有两个片段。使用导航库,我在这些片段之间切换。但是现在我需要从片段转到另一个活动。我的代码由于某种原因无法正常工作,logCat中没有错误。当我将此代码与Activity结合使用时,一切运行良好。仅仅是片段还是导航库?

我的ViewModel

class AuthViewModel @Inject constructor(private var mAuth: FirebaseAuth) : ViewModel() {

    var mEmail: String = ""
    var mPassword: String = ""

    var loginListener: LoginListener? = null

    fun login(view: View) {
        if (mEmail.isNotEmpty() && mPassword.isNotEmpty()) {
            mAuth = FirebaseAuth.getInstance()
            mAuth.signInWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener {
                if (it.isSuccessful) {
                    loginListener?.startLoading()
                    android.os.Handler().postDelayed({
                        loginListener?.endLoading()
                        loginListener?.validateLoginAndPassword()
                    }, 500)
                } else {
                    loginListener?.showError(textResource = R.string.login_error)
                }
            }
        } else {
            loginListener?.showError(textResource = R.string.login_or_password_empty)
        }
    }
}

我的片段

class LoginFragment : DaggerFragment(), View.OnClickListener, KeyboardVisibilityEventListener, LoginListener {

    private lateinit var navController: NavController
    lateinit var binding: FragmentLoginBinding

    @Inject
    lateinit var factory: ViewModelProvider.Factory
    lateinit var mAuthViewModel: AuthViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?): View? {
        binding = FragmentLoginBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        navController = Navigation.findNavController(view)
        view.btn_registration.setOnClickListener(this)

        mAuthViewModel = ViewModelProviders.of(this@LoginFragment, factory).get(AuthViewModel::class.java)

    }

    override fun onClick(view: View?) {
        when(view!!.id) {
            R.id.btn_registration -> navController.navigate(R.id.action_loginFragment_to_registerFragment)

        }
    }

    override fun validateLoginAndPassword() {
        //startActivity(Intent(activity, ContactListActivity::class.java))

        val intent = Intent(activity, ContactListActivity::class.java)
        startActivity(intent)
    }

我的LoginFragment XML

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

    <data>
        <variable
            name="loginViewModel"
            type="com.infernal93.phonebookappmvvmanddagger.viewmodels.AuthViewModel" />
    </data>

    <FrameLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusableInTouchMode="true"
        tools:context=".view.fragments.LoginFragment">

        <ScrollView
            android:id="@+id/root_scroll_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true"
            android:scrollbars="none">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusable="true"
                android:focusableInTouchMode="true" >

                <EditText
                    android:id="@+id/login_email"
                    android:layout_width="300dp"
                    android:layout_height="50dp"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="200dp"
                    android:background="@drawable/bg_inputs"
                    android:ems="10"
                    android:hint="@string/email_text"
                    android:text="@={loginViewModel.mEmail}"
                    android:inputType="textEmailAddress"
                    android:textColorHint="@color/dark_gray" />

                <EditText
                    android:id="@+id/login_password"
                    android:layout_width="300dp"
                    android:layout_height="50dp"
                    android:layout_below="@id/login_email"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="10dp"
                    android:background="@drawable/bg_inputs"
                    android:hint="@string/password_text"
                    android:text="@={loginViewModel.mPassword}"
                    android:inputType="textPassword"
                    android:textColorHint="@color/dark_gray" />

                <com.github.rahatarmanahmed.cpv.CircularProgressView
                    android:id="@+id/cpv_login"
                    android:layout_width="@dimen/cpv_size"
                    android:layout_height="@dimen/cpv_size"
                    android:layout_below="@id/login_password"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="15dp"
                    android:visibility="gone"
                    app:cpv_animAutostart="true"
                    app:cpv_color="@color/colorPrimary"
                    app:cpv_indeterminate="true" />

                <Button
                    android:id="@+id/btn_login_enter"
                    android:layout_width="250dp"
                    android:layout_height="50dp"
                    android:layout_below="@id/cpv_login"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="20dp"
                    android:background="@drawable/bg_buttons"
                    android:text="@string/login_btn_text"
                    android:textAllCaps="false"
                    android:textColor="@color/white"
                    android:textSize="@dimen/login_btns_text_size"
                    android:onClick="@{(view) -> loginViewModel.login(view)}"/>

                <Button
                    android:id="@+id/btn_registration"
                    android:layout_width="250dp"
                    android:layout_height="50dp"
                    android:layout_below="@id/btn_login_enter"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="20dp"
                    android:background="@drawable/bg_buttons"
                    android:text="@string/registration_btn_text"
                    android:textAllCaps="false"
                    android:textColor="@color/white"
                    android:textSize="@dimen/login_btns_text_size" />
            </RelativeLayout>

        </ScrollView>

    </FrameLayout>

</layout>

2 个答案:

答案 0 :(得分:1)

您没有将ViewModelView绑定。在下面使用:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    navController = Navigation.findNavController(view)
    view.btn_registration.setOnClickListener(this)

    mAuthViewModel = ViewModelProviders.of(this@LoginFragment, factory).get(AuthViewModel::class.java)

    //Bind viewmodel
    binding.loginViewModel = mAuthViewModel

}

答案 1 :(得分:0)

我忘记在片段中指定LoginListener

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?): View? {
        //return inflater.inflate(R.layout.fragment_login, container, false)
        binding = FragmentLoginBinding.inflate(inflater, container, false)

        mAuthViewModel = ViewModelProviders.of(this@LoginFragment, factory).get(AuthViewModel::class.java)

        binding.loginViewModel = mAuthViewModel

        // LoginListener
        mAuthViewModel.loginListener = this

        return binding.root
    }