android 自定义view的构造

61 阅读1分钟
  • 结论:blog.csdn.net/ls4568206/a…
  • 不管xml怎么写,系统只会回调到双参构造
  • 三参,四参构造需要自己在双参构造中委托
  • 三四参构造的目的是给 一些属性赋默认值
  •       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:1008)
          at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:1138)
          at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1099)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:1141)
          at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1099)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:680)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
          at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:710)
          at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195)
          //自定义view时,调用trace如上。
    
           try {
              //通过已注册的 Factory或 Factory2接口创建视图
              //典型的AppCompatActivity通过此接口将 TextView替换为 AppCompatTextView
              //内部通过new的方式创建view
              View view = tryCreateView(parent, name, context, attrs);
              if (view == null) {
                  final Object lastContext = mConstructorArgs[0];
                  mConstructorArgs[0] = context;
                  try {
                      if (-1 == name.indexOf('.')) {
                          //不含. 不是自定义view
                          view = onCreateView(context, parent, name, attrs);
                      } else {
                          //自定义view
                          view = createView(context, name, null, attrs);
                      }
                  } finally {
                      mConstructorArgs[0] = lastContext;
                  }
              }
    
              return view;
          } catch (InflateException e) {
              throw e;
          }
          //层层调用
          view = createView(context, name, null, attrs);
          final View view = constructor.newInstance(args);
          Object[] args = mConstructorArgs;
          //mConstructorArgs是LayoutInflater的普通属性。被定义为长度为2的数组
          //final Object[] mConstructorArgs = new Object[2];
          //通过反射方式创建view
          final View view = constructor.newInstance(args);
          return view;
          //所以,无论xml怎么写,自定义view只会走双参构造。