你好,我一直在修改应用程序,并且我一直在遵循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
}
}
编辑: 我尝试过
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不能为空
答案 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
用于初始选择,并且
分别Enumeration
或ArrayList
,并返回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