объявить findViewById ‘глобальным’

#android #kotlin #button #textview #findviewbyid

#Android #kotlin #кнопка #textview #findviewbyid

Вопрос:

Я довольно новичок в разработке Android с Kotlin, и я хочу объявлять кнопки и текстовые представления в начале моей программы. Чтобы я мог использовать их во всей программе.

Теперь следующий код работает так, как задумано, но, как мы видим, мне приходится использовать его два раза, и я хочу избежать этого.

var labelOutput: TextView = findViewById(R.id.textVIewOutput)

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

    var useButton: Button = findViewById(R.id.buButton1)
    var useButton2: Button = findViewById(R.id.buButton2)
    var labelOutput: TextView = findViewById(R.id.textVIewOutput)

    useButton.setOnClickListener{
        labelOutput.setText(calc(3.0, 4.0).toString()) 
    }
    useButton2.setOnClickListener{
        outputSomething()
    }
}

private fun calc (a:Double, b:Double): Double {
    val result = a   b
    return result
}

private fun outputSomething (){
    var labelOutput: TextView = findViewById(R.id.textVIewOutput)
    labelOutput.text = "something"
}
 

Однако, если я перемещу «var labelOutput: TextView = findViewById (R.id.textVIewOutput)» выше «переопределить fun onCreate«, чтобы сделать его «глобальным», а затем попытаюсь запустить приложение, оно просто вылетит.

Поэтому я не уверен, почему и как это происходит. Может быть, этот подход совершенно неправильный?

Ответ №1:

Вы должны объявить свой TextView глобально с помощью

 var labelOutput: TextView? = null
 

А затем инициализируйте его в своем onCreate методе с помощью:

 labelOutput = findViewById(R.id.textVIewOutput)
 

Вы не можете инициализировать свои представления до setContentView того, как вызов установит ваш текущий макет.

Чтобы использовать ваш labelOutput экземпляр, просто отредактируйте свою outputSomething функцию как

 private fun outputSomething (){
    labelOutput?.text = "something"
}