首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android上下文NullPointerException :尝试在空对象引用上调用虚拟方法

Android上下文NullPointerException :尝试在空对象引用上调用虚拟方法
EN

Stack Overflow用户
提问于 2018-05-16 06:06:16
回答 2查看 4.1K关注 0票数 0

我想在我的片段中创建TableLayout来插入数据。我在下面使用了这种方法。

我必须在onCreated视图方法外部调用updateTable方法。

但我总是得到这样的错误:

java.lang.NullPointerException:尝试对null对象引用调用虚拟方法“”android.content.res.Resources android.content.Context.getResources()“”

错误的完整代码:

代码语言:javascript
复制
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.tharwa.tdm2_exo2, PID: 5480
                  java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
                      at android.view.ViewConfiguration.get(ViewConfiguration.java:364)

                      ...

                      at com.tharwa.tdm2_exo2.TableAgent.TablePresentation.updateTable(TablePresentation.kt:61)

我已经尝试了几种方法来避免这个错误,但仍然总是出现。我也试图从onCreatedView获取上下文,但不起作用。

下面是我的函数:

代码语言:javascript
复制
class TablePresentation : DialogFragment(),tableContract.View
{
    ....

     override fun updateTable(temps: ArrayList<Double>)
     {
         for (i in 0 until temps.size) {
        val row =  TableRow(activity)
        row.setLayoutParams(LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT))
        row.setWeightSum(2.0f)
        val tv1 = TextView(activity)
        val tv2= TextView(activity)

        ...

        table!!.addView(row, i)
        }
     }

}

下面是该类的完整代码:

代码语言:javascript
复制
class TablePresentation : DialogFragment(),tableContract.View
{

    var table: TableLayout?=null

    override fun onCreateView(inflater: LayoutInflater?, parent: ViewGroup?, state: Bundle?): View? {
        super.onCreateView(inflater, parent, state)
        val view = activity.layoutInflater.inflate(R.layout.table_fragment, parent, false)
        view.findViewById<View>(R.id.button_close)?.setOnClickListener({ dismiss() })
        return view
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        table = view?.findViewById<View>(R.id.simpleTableLayout) as TableLayout
    }


    override fun onCreate(savedInstanceState: Bundle?) {
     ...
    }

    override fun onStart() {
      ...
    }


     override fun updateTable(temps: ArrayList<Double>)
     {
        ....
     }

}

下面是我如何将视图附加到控制器:

代码语言:javascript
复制
class PaletteController
{
    var father: FatherController?=null
    val view: PaletterPresentation
    var model:PaletteAbstraction?=null
    var TableSon:TableController?=null

    constructor(view:PaletterPresentation)
    {
        this.view=view
        view.controller=this
        this.model= PaletteAbstraction()

    }
    ....

    fun notifyTableChild()
    {
        TableSon= TableController(view.getTableChild())
        setChildSFather()
        TableSon?.updateTable( father!!.giveTemps())
    }
}

这就是我创建这个片段的原因:

代码语言:javascript
复制
class PaletterPresentation: Fragment(), PaletteContract.View
{
    var views: View? = null
    var controller: PaletteController?=null

    val tablePresentation=TablePresentation()

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        views = inflater!!.inflate(R.layout.palette_fragement, container, false)
        return views
    }
    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        fab.setOnClickListener { view ->
            val ft = childFragmentManager.beginTransaction()
            tablePresentation.show(ft, ContentValues.TAG)
            controller?.notifyTableChild()
        }
    }


    override fun getTableChild(): TablePresentation {
        return tablePresentation
    }

}

我真的不知道如何解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-16 06:58:07

您的片段未附加。

您正在执行以下操作:

代码语言:javascript
复制
    TableSon= TableController(view.getTableChild())
    setChildSFather()
    TableSon?.updateTable( father!!.giveTemps())

其中,getTableChild返回已初始化的内容,如下所示:

代码语言:javascript
复制
val tablePresentation=TablePresentation()

这会创建一个不附加到任何内容的“流氓”片段。

解决这个问题的一种方法是记住TablePresentation片段中的数组,然后从onAttach调用updateTable

编辑:所谓“记住”,我的意思是将其保存到参数中,而不仅仅是存储在成员中。

票数 1
EN

Stack Overflow用户

发布于 2018-05-17 04:05:01

@Dennis K我们可以从onAttach或者甚至从onViewCreated调用该方法。我知道这很好用。

但我的问题是,为什么我们不能这样做**方法的调用,我是说,**在这两个methode.Why之外,我们不能这样做吗?

最后,因为我还没有找到我为什么在onViewCreated.or上调用我的方法的答案,甚至在onAttached.like上,你说@Dennis K。

这就是调用

代码语言:javascript
复制
 override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        table = view?.findViewById<View>(R.id.simpleTableLayout) as TableLayout
        updateTable()
    }

下面是函数

代码语言:javascript
复制
fun updateTable()
     {
         val temps=controller?.getTemps()
         for (i in 0 until temps!!.size) {
        val row =  TableRow( activity)
        row.setLayoutParams(LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT))
        row.setWeightSum(2.0f)
        val tv1 = TextView( activity)
        val tv2= TextView(activity)

        tv1.setLayoutParams(TableRow.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f))
        tv2.setLayoutParams(TableRow.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f))

        tv1.setGravity(Gravity.CENTER)
        tv2.setGravity(Gravity.CENTER)

        tv1.setText((i+1).toString())
        tv2.setText(temps.get(i).toString())

        // finally add our textviews to TableRow
        row.addView(tv1)
        row.addView(tv2)
        //finally add our TableRow to Tablelayout
        table!!.addView(row, i)
        }
     }

为什么在onAttach/onViewCreated之外我们不能接收有效的活动(这是一个上下文)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50359814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档