Activity 的 TextView 为空

Posted

技术标签:

【中文标题】Activity 的 TextView 为空【英文标题】:Activity's TextView is null 【发布时间】:2019-07-04 11:06:12 【问题描述】:

我正在尝试使用OpenWeatherMapKotlinRetrofitMVP 和the clean architecture 制作一个应用程序来检查天气。

应用程序非常简单,只有一个活动,布局根据用户选择的位置显示不同的数据。在启动活动时,这会初始化onCreate中的presenter,并调用启动请求过程的方法。当我带着答案返回我的活动时,我试图在TextView 中显示有关该响应的一些信息,但应用程序崩溃了,因为该视图是null

我正在使用Kotlin android Extensions,理论上,它允许我仅使用其 ID 调用视图,而无需使用 findViewById

我是 Kotlin 的新手,也许我遗漏了一些东西。

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.climaconsulta.R
import com.climaconsulta.user.model.pojos.MainWeather
import com.climaconsulta.user.presenter.MainActivityPresenter
import com.climaconsulta.user.presenter.MainActivityPresenterImpl
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), MainActivityView 
    var presenter: MainActivityPresenter? = null

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        presenter = MainActivityPresenterImpl()
        presenter!!.getMainWeather("London")
    

    override fun showCurrentCity() 
        presenter!!.getCurrentCity()
    

    override fun showMainWeather(mainWeather: MainWeather) 
        mainTemperature.text = mainWeather.main!!.temp.toString()
        // HERE I TRY TO SET THE TEXT. BUT "mainTemperature" IS NULL
    

    override fun showFiveDaysWeather(cityName: String) 
        presenter!!.getFiveDaysWheather(cityName)
    

    override fun showError(error: String) 
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    

【问题讨论】:

向我们展示您的进口产品 抱歉...已添加进口! 【参考方案1】:

首先,为什么要强制可为空的类型自行运行?为什么不以presenter?.func() 这样的安全方式调用它? Force 调用会使您的应用崩溃,但 安全 调用 - 不会。

其次,将下面的这些行移到onStart()

presenter = MainActivityPresenterImpl()
presenter?.getMainWeather("London")

我想推荐你在presenter中使用MainActivityView 实现您的 MainActivity 的接口。我没有看到你什么时候设置 将其转换为presenter

示例 -->

BasePresenter:

abstract class BasePresenter<View : BaseView> 
    protected var view: View? = null

    open fun attachView(view: View) 
        this.view = view
    

    open fun detachView(view: View) 
        if (this.view == view) 
            this.view = null
        
    


interface BaseView 
    fun showError(error: String)

演讲者:

class MainPresenter() : BasePresenter<MainActivityView>() 
    private fun getMainWeather(name: String) 
        view?.showProgress(true)
        ...
    

MainActivity:

@Inject
protected lateinit var presenter: MainPresenter
...

override fun onStart() 
    super.onStart()
    presenter.attachView(this)


override fun onStop() 
    presenter.detachView(this)
    super.onStop()

是的,我使用 Dagger 2 来提供依赖项。你可以使用它,因为我很伤心:

presenter = MainActivityPresenterImpl()
presenter?.getMainWeather("London")

但如果您愿意,您可以查看简单的Dagger 2 implementation 用于一个小项目。

【讨论】:

不起作用..我得到数据。我的意思是,天气数据正在进入我的活动。但视图仍然为空。感谢您提供有关安全通话的信息​​。我正在使用!只是因为我相信那是正确的方式。但在你回答之后,我读到了。

以上是关于Activity 的 TextView 为空的主要内容,如果未能解决你的问题,请参考以下文章

在TextView文本中实现activity跳转

activity和resource的区别

未找到处理 Intent act=android.media.action.IMAGE_CAPTURE 的 Activity

根据TextView值打开Activity

未找到处理 Intent act=com.android.camera.action.CROP 的 Activity

安卓开发:service如何更新Activity里textView的内容。