Android aar在项目布局中找不到ID

时间:2019-05-07 16:25:19

标签: android

我创建了一个自定义日历视图组,其中包含一个微调框,以便用户选择年份。此自定义视图将在多个应用程序中使用,因此有必要创建可重复使用的内容(如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()

}

year_layout_text.xml

<?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"/>

在此代码中使用Android资源,APK可以看到资源,但是它们没有样式:

 val adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, android.R.id.text1, childAgeList)

在此使用我的自定义资源,APK找不到资源ID current_year,尽管它确实找到并使用了布局文件并在单击之前正确设置了样式

val adapter = ArrayAdapter(context,R.layout.year_layout_text,R.id.current_year, childAgeList)

您知道为什么AAR可以正确找到并渲染整个视图组布局,但是布局中的各个部分却没有吗?为什么在AAPK中找不到所有布局和资源,即使AAR显示在res /文件夹中也是如此,而在我的APK中,build / intermediates / res /也显示了它们。

2 个答案:

答案 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。