MIPB
MIPB

Reputation: 2471

Kotlin Android - Is there a way to define the Views only one time in a class?

In my code I make use of the following Views in XML:

        val googleButton: Button = findViewById<View>(R.id.google_login) as Button
        val loginWithEmailText: TextView = findViewById(R.id.login_with_email_text)
        val emailLoginButton: Button = findViewById(R.id.email_login_button)
        val createAccountButton: Button = findViewById(R.id.email_create_account_button)

This code is extracted from a function inside my Kotlin class. Whenever I have to access these views, I need to write this code all over again.

Is there any way that I can access them from only one place in my class code? I tried putting them outside but the app won't start.

Thank you

Upvotes: 0

Views: 655

Answers (1)

mrpasqal
mrpasqal

Reputation: 1080

You need to define these fields as a part of your class and initialize them once you set the layout resource for your Activity/Fragment. If you put these lines 1:1 in the class body, the initialization will fail, since the layout has not been inflated yet.

Please get familiar with the concept of lifecycle, so that you can understand how to approach View related topics: https://developer.android.com/guide/components/activities/activity-lifecycle

Please check out this snippet for a sample code:

class MyActivity: Activity() {
    lateinit var textView: TextView
    lateinit var button: Button

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

        // initialize your views here
        textView = findViewById(R.id.text_view_id)
        button = findViewById(R.id.button_id)
    }

    fun someOtherFunction(){
        // you can reference your views here like normal properties
        button.setOnClickListener { v -> callAnotherFunction() }
        // ...
    }
}

Since you are on Android, you might be interested in using Kotlin synthetic properties for referencing views without the whole boilerplate of finding them: https://antonioleiva.com/kotlin-android-extensions/. It's no longer a recommended practice to make use of it, but it's handy in some cases anyway.

Upvotes: 2

Related Questions