我创建了一个自定义日历视图组,其中包含一个微调框,以便用户选择年份。此自定义视图将在多个应用程序中使用,因此有必要创建可重复使用的内容(如AAR)。我需要执行一些特定的样式设置,因此无论在何处部署,该视图都看起来相同。
我的自定义视图组查找并呈现了视图组的主要布局。但是,当用户点击年份微调框并想要更改年份时,适配器找不到下拉菜单的布局的文本ID。我已经检查了APK中的合并清单,并且可以从AAR中看到布局和文本ID,但是点击后崩溃,错误为:
java.lang.RuntimeException: Failed to find view with ID us.martypants.mycustomviewgroup:id/current_year in item layout
足够有趣的是,如果我不是使用自定义布局和textId而是使用android的布局(即android.R.layout.simple_spiner_item和android.R.id.text1),则APK可以查找资源,显示选择列表并进行设置结果-尽管没有我需要的样式。
package com.algtskr.algtskrcommon
class DropdownAgeSelectView (context: Context, attrs: AttributeSet): RelativeLayout(context, attrs),
AdapterView.OnItemSelectedListener {
private var mCounterColor = 0
private var mAge = 0
init {
LayoutInflater.from(context)
.inflate(R.layout.dropdown_ageselect_layout, this, true)
attrs.let {
val typedArray = context.obtainStyledAttributes(it,
R.styleable.DropdownAgeSelectView, 0, 0)
mCounterColor = typedArray.getColor(R.styleable.DropdownAgeSelectView_counter_color, 0)
mAge = typedArray.getInteger(R.styleable.DropdownAgeSelectView_initial_value, 0)
typedArray.recycle()
}
val adapter = ArrayAdapter(context,R.layout.year_layout_text,R.id.current_year, childAgeList)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
spinner.onItemSelectedListener = this
initLayout()
}
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/current_year"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingStart="10dp"
tools:text="2019"
android:textColor="@color/blue_passenger"
android:textSize="24sp"/>
val adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, android.R.id.text1, childAgeList)
val adapter = ArrayAdapter(context,R.layout.year_layout_text,R.id.current_year, childAgeList)
您知道为什么AAR可以正确找到并渲染整个视图组布局,但是布局中的各个部分却没有吗?为什么在AAPK中找不到所有布局和资源,即使AAR显示在res /文件夹中也是如此,而在我的APK中,build / intermediates / res /也显示了它们。
答案 0 :(得分:0)
问题在这里:
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
当您将R.id.current_year
传递给ArrayAdapter
构造函数时,它将用于两者折叠视图和弹出窗口中的每一行(“下拉”视图) )。由于您的下拉式布局不包含ID为R.id.current_year
的视图,因此您将崩溃。
更改此setDropDownViewResource()
调用以使用您自己的自定义布局,包括R.id.current_year
TextView。
答案 1 :(得分:0)
由于您在构造函数中将R.id.current_year
作为适配器的TextView
样式进行传递,然后您在R.id.current_year
中传递的新布局中不包含setDropDownViewResource()
将崩溃,因为适配器在新布局中找不到R.id.current_yea
r。