【问题标题】:java.lang.IllegalStateException: TextView must not be null (Android/Kotlin)java.lang.IllegalStateException: TextView 不能为空 (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 你也可以参考我的回答:)

标签: android kotlin android-recyclerview


【解决方案1】:

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

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

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

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
    }
  1. 要使用布局内的任何布局视图,您可以将其与 (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】:

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

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-01-19
                • 1970-01-01
                • 2021-02-01
                • 2022-01-09
                • 1970-01-01
                • 2019-04-29
                • 2018-12-08
                相关资源
                最近更新 更多