java.lang.IllegalStateException: TextView 不能为空 (Android/Kotlin)

Posted

技术标签:

【中文标题】java.lang.IllegalStateException: TextView 不能为空 (Android/Kotlin)【英文标题】:java.lang.IllegalStateException: TextView must not be null (Android/Kotlin) 【发布时间】:2018-05-04 12:20:15 【问题描述】:

我的 Recycler View 有以下 ViewHolder 类,

inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) 

        private val dateText = itemView.itemDateSummaryList
        private val systolicVal = itemView.systolicValue
        private val diastolicVal = itemView.diastolicValue

        fun update(listItem: SummaryListItemModel) 
            Log.i(TAG, "Update method called " + listItem.date)
            dateText.text = listItem.date
            systolicVal.text = listItem.sysVal.toInt().toString()
            diastolicVal.text = listItem.diasVal.toInt().toString()
        

    

但是当我运行该应用程序时,dateText.text = listItem.date 会出现错误提示,

java.lang.IllegalStateException: dateText must not be null
at *****.******.*****.ui.detailview.bloodpressure.SummaryListAdapter$ItemViewHolder.update(SummaryListAdapter.kt:68)

listItem.date 不为空,我已检查日志。

【问题讨论】:

ctrl + 点击itemDateSummaryList 并查看textview 是否来自与infate 相同的布局文件或其他 也发布 XML。让我们看看。 @IronyStack 你是对的,我膨胀了错误的布局。 @kokilayaa 你也可以参考我的回答:) 【参考方案1】:

错误与listItem.date 无关,错误表明您尝试设置文本的dateText 文本视图为空,

仔细检查您使用的是正确的textview

可能性:1)您可能使用了错误的 idtextview2)您可能在膨胀视图时使用了错误的文件.

ctrl + 点击itemDateSummaryList 并查看textview 是否来自与infate 相同的布局文件或其他

【讨论】:

天哪,我所有的片段都是转换的活动,第一次转换的时候,我只是复制粘贴了它的 onCreateView 覆盖,忘记更改膨胀的布局,因为我将它粘贴到其他新片段上。这应该是公认的答案。该死。一个简单的错误,我花了 3 个小时【参考方案2】:

如果您使用片段: 1. 使用将保存您的布局引用的全局变量

private var root: View? = null   // create a global variable which will hold your layout 
 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
            root = inflater.inflate(R.layout.your_layout_file_name, container, false)  // initialize it here
            return root
    
    要使用布局内的任何布局视图,您可以将其与 (root.) 一起使用,例如:

root?.textView.text="Hello"

【讨论】:

请注意,如果您的视图位于导航标题或类似的东西中,那么您必须初始化这些视图。 编辑:请注意,如果您的视图位于导航标题或类似的东西中,那么您必须先初始化这些视图。类似,val navView: NavigationView = findViewById(R.id.nav_view) val navHeader = navView.getHeaderView(0) val textView = navHeader.findViewById(R.id.textView) as TextView【参考方案3】:

这是说您的 dateText 视图本身为 null 而不是值 listItem.date 验证您是否正确呈现它,itemview 具有您尝试访问的 id 的 TextView

【讨论】:

【参考方案4】:

我在使用 Fragment 时也遇到了同样的情况,我从 onCreateView 中取出我的代码并将其放到 onViewCreated 方法中,问题解决了。

【讨论】:

【参考方案5】:

我的片段收到此错误, 我解决了这个错误,

错误代码:

class MyFragment : Fragment()

    private var item: Item? = null

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        item = arguments?.getParcelable(BUNLDE_ITEM)
    

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
        item?.let 
            textViewTitle.text = "Text"
        
        return inflater.inflate(R.layout.my_fragment, null, false)
    

    companion object 
        private const val BUNLDE_ITEM = "item"
        fun newInstance(item: Item) = MyFragment().apply 
            arguments = Bundle().apply 
                putParcelable(BUNLDE_ITEM, item)
            
        
    


工作代码:

class MyFragment : Fragment() 

    private var item: Item? = null

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        item = arguments?.getParcelable(BUNLDE_ITEM)
    

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
        val root: View = inflater.inflate(R.layout.my_fragment, container, false)
        val textViewTitle = root.findViewById<View>(R.id.textViewTitle) as TextView

        item?.let 
            textViewTitle.text = "text"
        
        return root
    

    companion object 
        private const val BUNLDE_ITEM = "item"
        fun newInstance(item: Item) = MyFragment().apply 
            arguments = Bundle().apply 
                putParcelable(BUNLDE_ITEM, item)
            
        
    

【讨论】:

【参考方案6】:

xml 文件中的上下文引用错误也可能发生,通常是手动将 Activity 移动到另一个包时出现,android Studio 没有自动进行此更改:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:tools="http://schemas.android.com/tools"
        ....
        tools:context=".view.ui.login.LoginActivity">
....
</androidx.constraintlayout.widget.ConstraintLayout>

【讨论】:

【参考方案7】:

我阅读了所有这些答案,但没有一个对我有用,所以这是我的答案。

找到与此类似的代码行:

var view:View?=inflater.inflate(R.layout.fragment_profilefragement, container, false)

将光标放在fragement_ProfileFragement 上并使用CTRL 单击。检查您是否在正确的 fragment XML 文件中。

【讨论】:

【参考方案8】:

我的 RecyclerView 也遇到了同样的问题。它已经工作了几个月。在许多不成功的故障排除步骤之后,我执行了 Build > Clean Project 并解决了问题。

【讨论】:

【参考方案9】:

您已仔细查看,因为在您的代码的某些部分中您没有正确引用视图。换句话说,您的代码中不存在该特定视图。

    尝试重复您执行的步骤 在代码失败的类中检查您的视图是否正确膨胀。

这将节省您查找问题所在的时间。

【讨论】:

以上是关于java.lang.IllegalStateException: TextView 不能为空 (Android/Kotlin)的主要内容,如果未能解决你的问题,请参考以下文章