我想在我的片段中创建TableLayout来插入数据。我在下面使用了这种方法。
我必须在onCreated视图方法外部调用updateTable方法。
但我总是得到这样的错误:
java.lang.NullPointerException:尝试对null对象引用调用虚拟方法“”android.content.res.Resources android.content.Context.getResources()“”
错误的完整代码:
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
获取上下文,但不起作用。
下面是我的函数:
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)
}
}
}
下面是该类的完整代码:
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>)
{
....
}
}
下面是我如何将视图附加到控制器:
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())
}
}
这就是我创建这个片段的原因:
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
}
}
我真的不知道如何解决这个问题。
发布于 2018-05-16 06:58:07
您的片段未附加。
您正在执行以下操作:
TableSon= TableController(view.getTableChild())
setChildSFather()
TableSon?.updateTable( father!!.giveTemps())
其中,getTableChild
返回已初始化的内容,如下所示:
val tablePresentation=TablePresentation()
这会创建一个不附加到任何内容的“流氓”片段。
解决这个问题的一种方法是记住TablePresentation
片段中的数组,然后从onAttach
调用updateTable
。
编辑:所谓“记住”,我的意思是将其保存到参数中,而不仅仅是存储在成员中。
发布于 2018-05-17 04:05:01
@Dennis K我们可以从onAttach或者甚至从onViewCreated调用该方法。我知道这很好用。
但我的问题是,为什么我们不能这样做**方法的调用,我是说,**在这两个methode.Why之外,我们不能这样做吗?
最后,因为我还没有找到我为什么在onViewCreated.or上调用我的方法的答案,甚至在onAttached.like上,你说@Dennis K。
这就是调用
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
table = view?.findViewById<View>(R.id.simpleTableLayout) as TableLayout
updateTable()
}
下面是函数
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之外我们不能接收有效的活动(这是一个上下文)。
https://stackoverflow.com/questions/50359814
复制相似问题