Kotlin Android Spinner вылетает при загрузке приложения - PullRequest
0 голосов
/ 13 февраля 2019

Здравствуйте, я модифицировал приложение, и я следовал приведенным Android-примерам при создании Spinner, но мое приложение зависает при загрузке, точная часть, которая дает сбой, это spinner.adapter = adapter ,Приложение использует фрагментированный вид, и я попытался поместить следующий код в onCreate и onViewCreated, но оба приложения вылетали?Что я делаю не так, я прочитал 4 соответствующих поста, но они используют Java и имели проблемы с получением нулевых значений, но мой код должен загрузить статический массив, уже созданный в strings.xml.

ниже.перечислил весь код, который я реализовал для этой коробки Spinner, я что-то пропустил?

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

РЕДАКТИРОВАТЬ: я пробовал

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

Но я смотрю на logcat и вижу

Причина: java.lang.IllegalStateException: спиннер не должен быть нулевым

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Похоже, исправление было удалить 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
0 голосов
/ 14 февраля 2019

Spinner в Android с Kotlin

Я перешел на Android X.

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

Я написал две функции расширения, для начального * intselection и 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")
}

В вашей View вашей архитектуре .

val selectedItem: String = spn_test.spinnerAdapter(1, Test.values())

ПРИМЕЧАНИЕ: Кроме того, если вы используете какие-либо представления (TextView, Spinner и т. Д. В вашем Fragment с использованием синтетического Kotlin, в качестве контекста фрагмента, может быть null для безопасности, вы можете использовать это так

spn_test?.spinnerAdapter(1, Test.values())
txt_test?.text = "Kotlin is awesome!"
0 голосов
/ 13 февраля 2019

R.id.modeSpinner - это целочисленный идентификатор, вы не можете привести его к Spinner.

Использовать val spinner = findViewById<Spinner>(R.id.modeSpinner)

Не забудьте установить макет до доступ к просмотрам.

setContentView(R.layout.main)
...