Когда Android надувает Button
с помощью onClick
атрибута XML, он внутренне устанавливает DeclaredOnClickListener
для этого Button
, который затем использует отражение для запуска фактического onClick
метода в нашем коде.
case R.styleable.View_onClick:
[...]
final String handlerName = a.getString(attr);
if (handlerName != null) {
setOnClickListener(new DeclaredOnClickListener(this, handlerName));
}
break;
Я заметил, что для AppCompatButton
с (т.е. нормально Buttons
в AppCompatActivity
) тот же процесс повторяется в классе AppCompatViewInflater
, что приводит к 2 различным DeclaredOnClickListener
последовательным наборам.
private void checkOnClickListener(View view, AttributeSet attrs) {
Context context = view.getContext();
if (context instanceof ContextWrapper && (VERSION.SDK_INT < 15 || ViewCompat.hasOnClickListeners(view))) {
TypedArray a = context.obtainStyledAttributes(attrs, sOnClickAttrs);
String handlerName = a.getString(0);
if (handlerName != null) {
view.setOnClickListener(new AppCompatViewInflater.DeclaredOnClickListener(view, handlerName));
}
a.recycle();
}
}
Оба метода выполняются, и оба DeclaredOnClickListeners
создаются и устанавливаются на Button
. Сначала View
, который затем заменяется AppCompatViewInflater
. Все это происходит в процессе инфляции View
.
Это ошибка? Или какова цель этого поведения?