如何从对象调用函数?

时间:2020-01-28 12:06:32

标签: android kotlin

我无法从此类内的对象调用类的函数。 我该怎么办?

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

     private fun disableLoginButton(){
            button_login.isEnabled = false
     }

     private object textChangeListener: TextWatcher{

            override fun afterTextChanged(p0: Editable?) {
            }

            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }

            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                //Here i cannot call function
                disableLoginButton() // unresolved reference. 
            }

        }
    }

但是当我呼叫LoginActivity().disableLoginButton()而不是disableLoginButton()时,它是可见的,但失败

NullPointerException

login_button

2 个答案:

答案 0 :(得分:2)

尝试一下:

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

        editTextSample.addTextChangedListener(object : TextWatcher {

                override fun afterTextChanged(s: Editable) {}

                override fun beforeTextChanged(s: CharSequence, start: Int,
                                               count: Int, after: Int) {
                }

                override fun onTextChanged(s: CharSequence, start: Int,
                                           before: Int, count: Int) {
                    disableLoginButton()
                }
            })

            }




        }

     private fun disableLoginButton(){
                button_login.isEnabled = false
         }

答案 1 :(得分:0)

编辑:无效

From jetbrains team

在Java和Kotlin中,“内部”表示“捕获外部实例”,其中“嵌套”表示仅在其他内部声明。 Java的静态类仅是嵌套的,非静态的嵌套类是内部的。在Kotlin中,您必须将某些内容明确声明为“内部”(我们颠倒了Java的约定)。因此,您的对象不是内部对象,只是嵌套。实际上,没有命名对象可以在内部:命名对象是单例,因此不能依赖任何外部实例。

尝试将对象指定为内部对象

private inner object textChangeListener: TextWatcher{

     override fun afterTextChanged(p0: Editable?) {
     }

    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
     }

     override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int {
          //Here i cannot call function
           disableLoginButton() // unresolved reference. 
     }
}

这应该允许您访问外部范围。