Kotlin Android Spinner加载时使应用程序崩溃

时间:2019-02-12 21:59:43

标签: android kotlin spinner

你好,我一直在修改应用程序,并且我一直在遵循Android给出的示例来创建Spinner,但是我的应用程序一旦加载就会崩溃,崩溃的确切部分是 spinner.adapter = adapter >。该应用程序使用了零散的视图,我尝试将以下代码放入onCreate和onViewCreated中,但都使该应用程序崩溃?我在做什么错了,我已经阅读了4个匹配的帖子,但是它们使用Java,并且在获取空值时遇到问题,但是我的代码是加载已经在strings.xml中创建的静态数组。

在我下面列出了为此微调框实现的所有代码,我错过了什么吗?

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val spinner = R.id.modeSpinner as Spinner
    val arrayAdapter = ArrayAdapter.createFromResource(activity, R.array.rgb_mode_options, android.R.layout.simple_spinner_dropdown_item)
    arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.adapter = arrayAdapter
}

和我的strings.xml

<string-array name="rgb_mode_options">
    <item>Steady On</item>
    <item>Pulse</item>
    <item>Chase</item>
    <item>Rainbow</item>
    <item>Comet</item>
    <item>Candle</item>
    <item>Warm White</item>
    <item>Cool White</item>
</string-array>

和main.xml

<Spinner
    android:id="@+id/modeSpinner"
    android:layout_width="182dp"
    android:layout_height="31dp"
    android:layout_marginStart="16dp"
    android:layout_marginLeft="16dp"
    android:layout_marginTop="312dp"
    android:spinnerMode="dropdown"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

最后是SpinnerActivity,它在自己的名为SpinnerActivity.kt的标签中

package com.thanksmister.iot.esp8266.vo

import android.app.Activity
import android.view.View
import android.widget.AdapterView
import android.widget.Toast

class SpinnerActivity : Activity(), AdapterView.OnItemSelectedListener {

    override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {
        // An item was selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos)
        Toast.makeText(applicationContext, pos, Toast.LENGTH_LONG).show()
    }

    override fun onNothingSelected(parent: AdapterView<*>) {
        // Another interface callback
    }
}

Spinner tutorial

编辑: 我尝试过

super.onCreate(savedInstanceState)
    setContentView(getLayoutId())
    setSupportActionBar(toolbar)

val spinner = findViewById<Spinner>(R.id.modeSpinner)
val arrayAdapter = ArrayAdapter.createFromResource(this, 
R.array.rgb_mode_options, android.R.layout.simple_spinner_dropdown_item)
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.adapter = arrayAdapter

但是我看着看到的日志猫

原因:java.lang.IllegalStateException:Spinner不能为空

3 个答案:

答案 0 :(得分:1)

R.id.modeSpinner是一个整数ID,您不能将其强制转换为Spinner

使用val spinner = findViewById<Spinner>(R.id.modeSpinner)

在访问视图之前,请记住在 之前设置您的布局。

setContentView(R.layout.main)

答案 1 :(得分:0)

似乎解决方法是删除 val spinner = R.id.modeSpinner作为Spinner 包括 val spinner = findViewById(R.id.modeSpinner),而不是直接称为modeSpinner。

现在的代码是

val arrayAdapter = ArrayAdapter.createFromResource(activity, R.array.rgb_mode_options, 
android.R.layout.simple_spinner_dropdown_item)

arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
modeSpinner.adapter = arrayAdapter

答案 2 :(得分:0)

带有Kotlin的Android中的旋转器

我已经迁移到Android X。

        <androidx.appcompat.widget.AppCompatSpinner
                android:id="@+id/spn_test"
                android:layout_width="0dp"
                android:layout_height="wrap_content"/>

我已经编写了两个扩展函数,其中一个int用于初始选择,并且 分别EnumerationArrayList,并返回String,它是所选项目的名称。

扩展枚举:

fun <T> AppCompatSpinner.spinnerAdapterEnumeration(position: Int, array: Array<T>): String {
    var selectedItem: String = ""
    val adapter = ArrayAdapter(context, R.layout.simple_spinner_item, array)
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    this.adapter = adapter
    this.setSelection(position)
    this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }

        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            selectedItem = (array[position] as Enum<*>).name
        }
    }
    return selectedItem
}

ArrayList的扩展名:

fun AppCompatSpinner.spinnerAdapterArray(position: Int, array: ArrayList<String>): String {
    var selectedItem: String = ""
    val adapter = ArrayAdapter(context, R.layout.simple_spinner_item, array)
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    this.adapter = adapter
    this.setSelection(position)
    this.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }

        override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            selectedItem = array[position]
        }
    }
    return selectedItem

}

用法:

enum class Test(type: String) {
    Existing("EXISTING"),
    New("NEW")
}

在您的体系结构{em> 中。

View

注意:另外,如果您通过使用Kotlin合成在val selectedItem: String = spn_test.spinnerAdapter(1, Test.values()) 中使用任何视图(TextView,Spinner等。),作为片段的上下文,可以是{{ 1}}为了安全起见,您可以像这样

使用它
Fragment