Почему ButterKnife не может связывать поля, которые находятся в закрытых внутренних классах?

Во фрагменте у меня есть кнопка, которая открывает PopupWindow.

private class onMenuClickListener implements View.OnClickListener {
    @BindView(R.id.popup_radiogroup) RadioGroup popupRadioGroup;
    @BindView(R.id.popup_textview) TextView popupTextView;

    PopupWindow popupWindow = getPopupWindow(R.layout.popup_window);

    @Override
    public void onClick(View v) {
        ButterKnife.bind(this, popupWindow.getContentView());
        popupWindow.showAsDropDown(menuButton);
    }
}
private PopupWindow getPopupWindow(int layout_resource_id)  {
    LayoutInflater inflater = (LayoutInflater) getContext()
            .getSystemService(LAYOUT_INFLATER_SERVICE);
    View popupView = inflater.inflate(layout_resource_id,(ViewGroup)getView());

    return new PopupWindow(popupView,
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT,true);
}

Когда я пытаюсь запустить этот код, я получаю эту ошибку: "Поля @BindView могут не содержаться в частных классах". Как получается, что ButterKnife не может получить доступ к закрытым внутренним классам, но он может свободно получить доступ к защищенным?

1 ответ

Решение

Они не могут не быть частными, потому что иначе это не могло бы получить к нему доступ. ButterKnife генерирует некоторый код для вас, который содержит весь стандартный код, который вы не готовы писать для вас. Что он делает, когда пишешь ButterKnife.bind(this), где this в этом случае ваш Activityпытается получить доступ к каждому ButterKnife аннотированный член через предоставленную вами ссылку, и сделать findViewById с явным приведением. Если член является приватным, доступ к нему невозможен (базовый Java).

Другие вопросы по тегам