Почему атрибут onClick XML устанавливает OnClickListener ДВАЖДЫ на AppCompatButtons - PullRequest
0 голосов
/ 08 мая 2019

Когда 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. Это ошибка? Или какова цель этого поведения?

...