I am referring to both questions: Android ViewBinding with CustomView and How to use View Binding on custom views
I am currently migrating from Kotlin synthetics to view binding and I am using alot of custom generated views, mainly to ajust the view size when pressed. It looks like the following (prior to that was java code, if I did something wrong while switching to kotlin please feel free to correct me):
class CustomButton constructor(context: Context, attrs: AttributeSet?): AppCompatButton(context, attrs) {
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
super.onTouchEvent(event)
if (event.action == MotionEvent.ACTION_CANCEL) {
val regainer =
AnimatorInflater.loadAnimator(context, R.animator.regain_size) as AnimatorSet
regainer.setTarget(this)
regainer.start()
return true
}
when (event.action) {
MotionEvent.ACTION_DOWN -> {
val reducer = AnimatorInflater.loadAnimator(context, R.animator.reduce_size) as AnimatorSet
reducer.setTarget(this)
reducer.start()
return true
}
MotionEvent.ACTION_UP -> {
val regainer = AnimatorInflater.loadAnimator(context, R.animator.regain_size) as AnimatorSet
regainer.setTarget(this)
regainer.start()
return true
}
}
return false
}
override fun performClick(): Boolean {
super.performClick()
return true
}
Unfortunatly all the questions I looked up so far only reffer to a solution including a custom .xml file. My binding in the activity looks like this:
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.customButton.//...
}
What I am currently getting is an android.view.InflateException
through that custom view. Does anyone have an idea on how to implement view binding in this case or how to initialize it in the CustomButton class? Any help with this is much appreciated!
Best regards, Markus
This is the stack trace of the error:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.my.app, PID: 13035
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.MainActivity}: android.view.InflateException: Binary XML file line #39 in com.my.app:layout/activity_main: Binary XML file line #39 in com.my.app:layout/activity_main: Error inflating class com.my.app.custom.CustomTextView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3611)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3775)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2246)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8010)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
Caused by: android.view.InflateException: Binary XML file line #39 in com.my.app:layout/activity_main: Binary XML file line #39 in com.my.app:layout/activity_main: Error inflating class com.my.app.custom.CustomTextView
Caused by: android.view.InflateException: Binary XML file line #39 in com.my.app:layout/activity_main: Error inflating class com.my.app.custom.CustomTextView
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:852)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1004)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1121)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
at android.view.LayoutInflater.inflate(LayoutInflater.java:680)
at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
at com.my.app.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:78)
at com.my.app.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:72)
at com.my.app.MainActivity.onCreate(MainActivity.kt:59)
at android.app.Activity.performCreate(Activity.java:8006)
at android.app.Activity.performCreate(Activity.java:7990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3584)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3775)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2246)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8010)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 5: TypedValue{t=0x2/d=0x7f0302ca a=-1}
at android.content.res.TypedArray.getColorStateList(TypedArray.java:625)
at android.widget.TextView.readTextAppearance(TextView.java:4000)
E/AndroidRuntime: at android.widget.TextView.<init>(TextView.java:1093)
at android.widget.TextView.<init>(TextView.java:994)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:102)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:97)
at com.my.app.custom.CustomTextView.<init>(CustomTextView.kt:13)
... 27 more
CustomTextView.kt:13 is this line:
class CustomTextView constructor(context: Context, attrs: AttributeSet?) : AppCompatTextView(context, attrs) {
MainActivity.kt:59 is this line:
binding = ActivityMainBinding.inflate(layoutInflater)
The activity_main.xml looks like this:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_constrainedHeight="true"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/mainGuidelineVerticalLeft"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.05"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/mainGuidelineVerticalRight"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.95"/>
<com.my.app.custom.CustomTextView
android:id="@+id/mainSubmenuSettings"
android:layout_width="wrap_content"
android:layout_height="@dimen/minimum"
android:gravity="center"
android:paddingHorizontal="12dp"
android:layout_marginEnd="12dp"
android:text="@string/textViewSettings"
android:textColor="?attr/primaryTextColorDefault"
android:textSize="@dimen/textViewS"
android:textStyle="bold"
android:focusable="true"
android:clickable="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<com.my.app.custom.CustomCardView
android:id="@+id/mainCardView1"
android:layout_width="0dp"
android:layout_height="@dimen/cardViewHeightLarge"
android:layout_marginVertical="@dimen/cardViewMarginVertical"
android:clickable="true"
android:focusable="true"
android:elevation="@dimen/elevation"
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="@dimen/cardViewCornerRadiusLarge"
app:cardUseCompatPadding="true"
app:layout_constraintBottom_toTopOf="@id/mainCardView2"
app:layout_constraintEnd_toStartOf="@+id/mainGuidelineVerticalRight"
app:layout_constraintStart_toStartOf="@+id/mainGuidelineVerticalLeft"
app:layout_constraintVertical_chainStyle="packed">
</com.my.app.custom.CustomCardView>
<com.my.app.custom.CustomCardView
android:id="@+id/mainCardView2"
android:layout_width="0dp"
android:layout_height="@dimen/cardViewHeightLarge"
android:layout_marginTop="@dimen/cardViewMarginVertical"
android:layout_marginBottom="10dp"
android:clickable="true"
android:focusable="true"
android:elevation="@dimen/elevation"
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="@dimen/cardViewCornerRadiusLarge"
app:cardUseCompatPadding="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/mainGuidelineVerticalRight"
app:layout_constraintStart_toStartOf="@+id/mainGuidelineVerticalLeft"
app:layout_constraintVertical_chainStyle="packed">
</com.my.app.custom.CustomCardView>
</androidx.constraintlayout.widget.ConstraintLayout>