android.view.InflateException:二进制XML文件行#32:二进制XML文件行#32:错误导致类

时间:2017-03-27 09:41:05

标签: android android-layout android-studio kotlin

我目前在我的应用中遇到了一个问题,我已经查看并尝试了很多解决方案,但我找不到任何实际可行的方法。

我有一个包含自定义组件列表的活动。这个组件是包含在LinearLayout中的android CardView元素。

每个卡片组件都包含一个相对布局,默认情况下为空。

在活动XML文件中调用组件时,我添加了自定义属性app:partLayout="@layout/choice_access_part"。此属性在我的组件代码中处理。之后,我在partLayout属性中添加了引用中传递的布局add我尝试将它添加到我的组件中的RelativeLayout。

val inflatedLayout: View = inflater.inflate(partLayout, selectionContainer, false)
selectionContainer.addView(inflatedLayout)

编译应用程序并运行它没有问题,直到我到达代码的这一部分并得到错误:android.view.InflateException: Binary XML file line #32: Binary XML file line #32: Error inflating class

组件代码

class MultipleChoiceCard(context: Context?, attrs: AttributeSet?) : CardView(context, attrs) {

    val title: TextView
    val nonMandatoryText: TextView
    val selectionContainer: RelativeLayout

    init {
        val inflater: LayoutInflater = context?.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        inflater.inflate(R.layout.component_multiple_choice, this)

        // Getting elements in XML
        title = find(R.id.multiple_choice_title)
        nonMandatoryText = find(R.id.non_mandatory_text)
        selectionContainer = find(R.id.selection_container)

        // Extract value from XML
        val a = context.theme.obtainStyledAttributes(attrs, R.styleable.MultipleChoiceCard, 0, 0)
        val titleValue = a.getString(R.styleable.MultipleChoiceCard_title)
        val nonMandatoryTextValue = a.getString(R.styleable.MultipleChoiceCard_nonMandatoryText) ?: ""
        val colorValue = a.getInt(R.styleable.MultipleChoiceCard_cardColor, R.color.user_deep_orange)
        val partLayout = a.getInt(R.styleable.MultipleChoiceCard_partLayout, R.layout.choice_rythm_part)

        // Applying the XML values to the wanted elements
        title.text = titleValue
        title.setTextColor(colorValue)
        // Set the non mandatory text visible if the value is not an empty string
        if(nonMandatoryTextValue != ""){
            nonMandatoryText.visibility = View.VISIBLE
            nonMandatoryText.text = nonMandatoryTextValue
        }

        val inflatedLayout: View = inflater.inflate(partLayout, selectionContainer, false)
        selectionContainer.addView(inflatedLayout)

        a?.recycle()

    }

}

组件XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.CardView
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:padding="20dp"
        android:id="@+id/rythm_card"
        app:cardBackgroundColor="#2d292a">

        <RelativeLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:padding="20dp">

            <TextView
                android:id="@+id/multiple_choice_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAllCaps="true"
                android:textColor="@color/user_deep_orange"
                android:layout_marginBottom="10dp"
                android:textStyle="bold">
            </TextView>

            <TextView
                android:id="@+id/non_mandatory_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/multiple_choice_title"
                android:textColor="#8c8f91"
                android:textSize="13sp"
                android:textStyle="italic"
                android:visibility="gone"
                android:layout_marginBottom="10dp">
            </TextView>

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/non_mandatory_text"
                android:id="@+id/selection_container">

            </RelativeLayout>

        </RelativeLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

布局作为属性传递

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/non_mandatory_text"
        android:id="@+id/rythm_radio_group">

        <RadioButton
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="Libre"
            android:textSize="20sp"
            android:layoutDirection="rtl"
            android:buttonTint="@color/user_deep_orange"
            android:layout_marginBottom="10dp">

        </RadioButton>

        <RadioButton
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="Toutes les 10 secondes"
            android:textSize="20sp"
            android:layoutDirection="rtl"
            android:buttonTint="@color/user_deep_orange"
            android:layout_marginBottom="10dp">

        </RadioButton>

        <RadioButton
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="Toutes les 30 secondes"
            android:textSize="20sp"
            android:layoutDirection="rtl"
            android:buttonTint="@color/user_deep_orange"
            android:layout_marginBottom="10dp">

        </RadioButton>

        <RadioButton
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:text="Toutes les minutes"
            android:textSize="20sp"
            android:layoutDirection="rtl"
            android:buttonTint="@color/user_deep_orange">

        </RadioButton>

    </RadioGroup>


</LinearLayout>

1 个答案:

答案 0 :(得分:0)

在搜索之后,我找到了解决方案,这只是一个愚蠢的错误。

val partLayout = a.getInt(R.styleable.MultipleChoiceCard_partLayout, R.layout.choice_rythm_part)必须获取resourceId而不是int,因此解决方案是将getInt替换为getResourceId

代码应该是这样的。

val partLayout = a.getResourceId(R.styleable.MultipleChoiceCard_partLayout, R.layout.choice_rythm_part)

我在post找到了解决方案。