我目前在我的应用中遇到了一个问题,我已经查看并尝试了很多解决方案,但我找不到任何实际可行的方法。
我有一个包含自定义组件列表的活动。这个组件是包含在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>
答案 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找到了解决方案。