Обновление текста textView из объекта-компаньона класса - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь обновить textView из объекта-компаньона класса, и приложение вылетает. Что я делаю не так?

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.test.testapp.classes.ExampleClass
import kotlinx.android.synthetic.main.activity_main.*

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

        testMessage.text = "1"
        ExampleClass.writeText("2")
    }
}

ExampleClass.kt

import com.test.testapp.MainActivity
import kotlinx.android.synthetic.main.activity_main.*

class ExampleClass {
    companion object{
        fun writeText(textValue:String) {
            MainActivity().testMessage.text = textValue
        }
    }
}

Сообщение об ошибке студии Android:

FATAL EXCEPTION: main Process: com.test.testapp, PID: 15819
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.testapp/com.test.testapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

Ответы [ 3 ]

3 голосов
/ 31 октября 2019

Поскольку с кодом MainActivity()... вы не получаете загруженное действие, но вы создаете новое действие, которое еще не было показано, поэтому представление не существует.

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

пример

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

        testMessage.text = "1"
        ExampleClass.writeText("2",this)
    }
}

class ExampleClass {
    companion object{
        fun writeText(textValue:String,mainActivity:MainActivity) {
            mainActivity.testMessage.text = textValue
        }
    }
}

Я не знаю точно, почему вы хотите это сделать, но если вы хотитепередавать данные между действиями, фрагментами или службами, проверяя, что https://developer.android.com/guide/components/intents-filters

1 голос
/ 31 октября 2019

внутри writeText (textValue: String) , вы создаете новый экземпляр MainActivity (MainActivity ()) в , для которого textView равно null , ине получить существующий

, вы не должны использовать объект-компаньон для этого. Могли бы объяснить ситуацию, зачем вам это нужно

, если оно необходимо , вы можете сделать так:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.test.testapp.classes.ExampleClass
import kotlinx.android.synthetic.main.activity_main.*

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

        testMessage.text = "1"
        ExampleClass.writeText("2", testMessage)
    }
}

ExampleClass.kt

import com.test.testapp.MainActivity
import kotlinx.android.synthetic.main.activity_main.*

class ExampleClass {
    companion object{
        fun writeText(textValue:String, textView: TextView) {
            textView.text = textValue
        }
    }
}
0 голосов
/ 31 октября 2019

Попробуйте вот так

Передайте MainActivity Object в ExampleClass

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

        testMessage.text = "1"
        ExampleClass.writeText("2",this)
    }
}

И используйте MainActivity object для доступа к его свойствам.

class ExampleClass {
    companion object{
        fun writeText(textValue:String,mainActivity: MainActivity) {
            mainActivity.testMessage.text = textValue
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...