Android:Spinner 在 relativeLayout 类中给出 android.content.res.Resources$NotFoundException 错误

问题描述

这一切都在 kotlin 中。

我有一个微调器,但我无法动态填充它。但我可以用来自 strings.xml 资源的数组填充它。

这是没有来自strings.xml的数组的微调器的xml:

<Spinner
        android:id="@+id/brand_name_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

如果我从 strings.xml 添加数组,它是下面的代码,只要我不尝试动态填充微调器,它就可以工作:

<Spinner
        android:id="@+id/brand_name_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/brand_names"/>

但我不想动态填充它,也不想使用资源中的数组。 Spinner 只能在 RelativeLayout 类中制作:

class BrandSelectionStartupPage : RelativeLayout {

constructor(context: Context?) : super(context)
constructor(context: Context?,attrs: AttributeSet?) : super(context,attrs)
constructor(context: Context?,attrs: AttributeSet?,defStyleAttr: Int) : super(context,attrs,defStyleAttr)

...

这是我制作微调器的地方:

init {
    LayoutInflater.from(context).inflate(R.layout.brand_selection_startup_page,this,true)
    val brandNames = findViewById<Spinner>(R.id.brand_name_input)
    val arrayAdapter =  ArrayAdapter(context,brandToAbbreviationsDivisions.keys.size,brandToAbbreviationsDivisions.keys.toList())
    arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    brandNames.adapter = arrayAdapter

崩溃日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.company.pos,PID: 12859
android.content.res.Resources$NotFoundException: Resource ID #0x23
    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:216)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2148)
    at android.content.res.Resources.getLayout(Resources.java:1157)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:421)
    at android.widget.ArrayAdapter.createViewFromresource(ArrayAdapter.java:416)
    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:407)
    at android.widget.Absspinner.onMeasure(Absspinner.java:205)
    at android.widget.Spinner.onMeasure(Spinner.java:672)
    at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:428)
    at android.view.View.measure(View.java:23279)
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
    at android.view.View.measure(View.java:23279)

我尝试使用 simple_spinner_item 而不是 simple_spinner_dropdown_item 但结果相同。我不确定问题是什么。我认为这与课程不是活动或片段这一事实有关,但我不确定并且在网上找不到任何东西。

我看过:Android spinner give a NullPointException

Add a Spinner to a RelativeLayout dynamically

Android: Create spinner programmatically from array

他们都没有帮助。

解决方法

我猜你的后备数组中有 35 个条目供微调器使用。你的线路

val arrayAdapter =  ArrayAdapter(context,brandToAbbreviationsDivisions.keys.size,brandToAbbreviationsDivisions.keys.toList())

不正确。第二个参数应该是一个资源而不是数组的大小。见ArrayAdapter。 Android 正在寻找一个资源,它的 id 是数组的大小。这就是我们看到 0x23 的奇怪资源 ID 以及您看到崩溃的原因。