When you change attributes in an xml file, which constructor of custom view is called?

I am creating my own custom view.

Here is the code for MyCustomView.java

    package com.krish.customviews
    public class MyCustomView extends FrameLayout{
          public MyCustomView(@NonNull Context context){

          public MyCustomView(@NonNull Context context, @Nullable AttributeSet attrs){
               super(context, attrs);

          public MyCustomView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr){
               super(context, attrs, defStyleAttr);

          private void init(){

And my main_layout.xml file:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"


//layout attributes


My question is: If I change the attributes of the custom view in the .xml file, will the 2nd or 3rd constructor of MyCustomView.java file be called?


As described by @Zain answer the two-argument constructor is called when the layout is inflated from XML.

  • The defStyleAttr is the default style. It doesn’t directly point to a style, but lets you point to one of the attributes defined in your theme.
    If you’re subclassing a widget and not specifying your own default style then be sure to use the parent classes default style in your constructors (don’t just pass 0). It can be 0 only to not look for defaults.
    For example in the MaterialButton: R.attr.materialButtonStyle

  • The defStyleRes is a resource identifier of a style resource that supplies default values for the view, used only if defStyleAttr is 0 or can not be found in the theme. Can be 0 to not look for defaults.
    For example in the MaterialButton: R.style.Widget_MaterialComponents_Button

The AttributeSet parameter can essentially be thought of as a map of the XML parameters you specify in your layout.
Keep in mind the styling precedence order:

When determining the final value of a particular attribute, there are four inputs that come into play:

  • Any attribute values in the given AttributeSet.
  • The style resource specified in the AttributeSet (named "style").
  • The default style specified by defStyleAttr and defStyleRes
  • The base values in this theme.

Source: stackoverflow