Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为ListView使用字符串资源时的空对象引用_Android_Kotlin_Android Listview_Android Arrayadapter - Fatal编程技术网

Android 为ListView使用字符串资源时的空对象引用

Android 为ListView使用字符串资源时的空对象引用,android,kotlin,android-listview,android-arrayadapter,Android,Kotlin,Android Listview,Android Arrayadapter,为什么每当我尝试对列表视图使用简单数组时,都会出现此错误: 尝试在空对象引用上调用虚拟方法“android.content.res.Resources android.content.Context.getResources()” 我真的不明白我在这里做错了什么,因为我尝试了使用不同的上下文(base和application),但在解决这个问题上仍然没有改变 class MainActivity : AppCompatActivity() { override fun onCreat

为什么每当我尝试对
列表视图使用简单数组时,都会出现此错误:

尝试在空对象引用上调用虚拟方法“android.content.res.Resources android.content.Context.getResources()”

我真的不明白我在这里做错了什么,因为我尝试了使用不同的上下文(
base
application
),但在解决这个问题上仍然没有改变

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var array = arrayOf(resources.getString(R.string.item_a), 
        resources.getString(R.string.item_b), 
        resources.getString(R.string.item_c), 
        resources.getString(R.string.item_d))

        val adapter = ArrayAdapter(this,
                R.layout.listview_item, array)

        val listView:ListView = findViewById(R.id.listview_1)
        listView.setAdapter(adapter)
    }

override fun onItemClick(view: View, position: Int) {
    if (array[position] == resources.getString(R.string.item_a)){
        Toast.makeText(this, "Hi there! This is a Toast.", Toast.LENGTH_SHORT).show()
    }
}

} 

这里发生了两件事

首先,如果在活动的类级别声明并初始化字符串资源数组,则会出现错误。您的活动在构建时没有立即“准备就绪”;您需要先调用
super.onCreate()
,然后才能访问资源

其次,如果将整个数组移动到
onCreate()
中,则将无法从
onItemClick()
访问它(因为现在它是onCreate的本地)

解决方案是使用
lateinit var
,这样您可以在类级别声明数组,然后在
onCreate()中初始化它:

class MainActivity:AppCompatActivity(){
私有lateinit变量数组:数组
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
this.array=arrayOf(…)
// ...
}
覆盖MClick(视图:视图,位置:Int){
if(array[position]==resources.getString(R.string.item_a)){
// ...
}
}
}

<代码> > var数组= alayof(资源).GETSHIPE(R.Studio ItMySa),Realth.GETStand(R.Studio ItMySB),Realth.GETStand(R.Studio ItMySc),Realth.GETStand(R.Studio ItMyd),内的代码> OnCuto()/代码> MeoDoI,但是为什么<代码>数组< /代码> <代码> >(数组[Posi])==resources.getString(R.string.item_a))
是否立即给出此错误<代码>未解析引用:array
可能是因为您尚未在所引用的范围内定义名为array的变量。@mightyWOZ是否需要在创建
之前定义此变量?您可以将其声明为类变量,然后您可以在任何函数中访问它。
class MainActivity : AppCompatActivity() {

    private lateinit var array: Array<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this.array = arrayOf(...)
        // ...
    }

    override fun onItemClick(view: View, position: Int) {
        if (array[position] == resources.getString(R.string.item_a)){
            // ...
        }
    }
}