【问题标题】:Unable to call ViewModel method from activity无法从活动中调用 ViewModel 方法
【发布时间】:2019-12-06 10:47:49
【问题描述】:

我正在尝试从活动中调用 viewModel 中的方法,但未调用该方法。

LoginViewModel

class LoginViewModel : ViewModel() {

    private var mLoginData: MutableLiveData<LoginModal>? = null
    private var loginRepository: LoginRepository? = null

    fun initLogin(jsonObject: JsonObject) {
        if (mLoginData != null) {
            return
        }
        loginRepository = LoginRepository().getInstance()
        mLoginData = loginRepository?.getLoginData(jsonObject)
    }

    fun getLoginData(): MutableLiveData<LoginModal>? {
        return mLoginData
    }
}

LoginActivity

class LoginActivity : AppCompatActivity() {

    var etUsername: EditText? = null
    var etPassword: EditText? = null

    var loginViewModel: LoginViewModel? = null
    private var mLoginData: MutableLiveData<LoginModal>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.statusBarColor = ContextCompat.getColor(this, R.color.colorPrimary);

        etUsername = findViewById(R.id.et_username)
        etPassword = findViewById(R.id.et_password)

        loginViewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)

    }

    fun login(view: View) {
        val jsonObject = JsonObject()
        jsonObject.addProperty("userId", etUsername!!.text.toString())
        jsonObject.addProperty("password", etPassword!!.text.toString())
        jsonObject.addProperty("deviceId", "45684")

        loginViewModel?.initLogin(jsonObject)

        Log.d("Login Activity", "Login Data : " + mLoginData)
    }
}

login方法被一个按钮的onClick调用,但是initLogin没有被调用。

请帮忙。谢谢你

更新:

XML 用于调用 login 的位置..

<ImageButton
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:src="@drawable/ic_login"
    android:background="@android:color/transparent"
    android:onClick="login"/>

【问题讨论】:

  • 日志Log.d("Login Activity", "Login Data : " + mLoginData)login内是否打印?
  • 你调试过代码吗?
  • 是的,我已经调试过了,mLoginData是在LoginActivity中定义的,误删了。我将编辑问题
  • 发布您的 xml 文件
  • 请清除mLoginData。您将它添加到ActivityViewModel。没有得到它的目的

标签: android kotlin mvvm viewmodel


【解决方案1】:
        1. XML-
          <ImageButton
                   android:layout_width="80dp"
                   android:layout_height="80dp"
                   android:src="@drawable/ic_more"
                   android:background="@android:color/transparent"
                   android:onClick="login"/>
        2. Activity-
            lateinit var viewModel: LoginViewModel
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)

         viewModel=ViewModelProviders.of(this).get(LoginViewModel::class.java)

            }

            fun login(view: View) {
                Log.d("Activity:", "login method called")
                viewModel.initLogin()
            }

    3. View Model 
    fun initLogin() {
            Log.d("Login View model:", "init Login called")
        }

我已经创建了涉及上述问题的示例。但它对我来说很好。请参考我的示例代码。

【讨论】:

    【解决方案2】:

    试试代码:

     <data>
    <veriable name="login" type="com.example.databinding.Login"/>
    </data>
        <ImageButton
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/ic_login"
        android:background="@android:color/transparent"
        android:onClick="@{login}"/>
    

    【讨论】:

    • 请用解决方案说明问题。你明白是什么问题吗?
    • 我的朋友 onClick 已经开始工作了。请再次阅读问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2012-03-28
    • 2012-11-06
    • 2021-01-19
    相关资源
    最近更新 更多