Почему 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).