Самый простой способ точно определить, когда происходит внедрение, - это проверить код, который генерирует AndroidAnnotations.Для ваших примеров я сделал простое действие и фрагмент, как показано ниже:
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@ViewById(R.id.textView)
TextView textView;
@AfterViews
public void activityTestMethod() {
}
}
@EFragment(R.layout.fragment_main)
public class MainFragment extends Fragment {
@ViewById(R.id.imageView)
ImageView imageView;
@AfterViews
public void fragmentTestMethod() {
}
}
, а затем запустил ./gradlew app:assembleDebug
, чтобы заставить Android-аннотации генерировать соответствующие классы MainActivity_
и MainFragment_
.Давайте сначала посмотрим на MainActivity_
(нерелевантный код опущен):
public final class MainActivity_
extends MainActivity
implements HasViews, OnViewChangedListener
{
@Override
public void onCreate(Bundle savedInstanceState) {
OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_);
init_(savedInstanceState);
super.onCreate(savedInstanceState);
OnViewChangedNotifier.replaceNotifier(previousNotifier);
setContentView(R.layout.activity_main);
}
private void init_(Bundle savedInstanceState) {
OnViewChangedNotifier.registerOnViewChangedListener(this);
}
@Override
public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
onViewChangedNotifier_.notifyViewChanged(this);
}
@Override
public void onViewChanged(HasViews hasViews) {
this.textView = hasViews.internalFindViewById(R.id.textView);
activityTestMethod();
}
}
Последовательность событий, которая приводит к тому, что наши представления связаны и наши методы @AfterViews
вызывают, выглядит следующим образом:
- В
onCreate
экземпляр MainActivity_
регистрируется как OnViewChangedNotifier
. onCreate
, звонки setContentView
. - *, 1025 * звонки
notifyViewChanged
,который запускает (синхронный) вызов onViewChanged
. onViewChanged
, привязывает все поля, отмеченные @ViewById
, , затем вызывает все методы, отмеченные @AfterViews
.
Следовательно, @ViewById
-аннотированные представления связаны и доступны для использования после вызова onCreate
, а @AfterViews
-аннотированные методы будут выполняться в конце onCreate
и перед любым другим жизненным циклом Activitymethod.
Эта история похожа на MainFragment_
:
public final class MainFragment_
extends com.stkent.aatest.MainFragment
implements HasViews, OnViewChangedListener
{
@Override
public void onCreate(Bundle savedInstanceState) {
OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_);
init_(savedInstanceState);
super.onCreate(savedInstanceState);
OnViewChangedNotifier.replaceNotifier(previousNotifier);
}
private void init_(Bundle savedInstanceState) {
OnViewChangedNotifier.registerOnViewChangedListener(this);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
onViewChangedNotifier_.notifyViewChanged(this);
}
@Override
public void onViewChanged(HasViews hasViews) {
this.imageView = hasViews.internalFindViewById(R.id.imageView);
fragmentTestMethod();
}
}
Последовательность событий, которая приводит к тому, что наши представления связаны и наши @AfterViews
методы вызывают, выглядит следующим образом:
- В
onCreate
экземпляр MainFragment_
регистрируется как вызов OnViewChangedNotifier
. onViewCreated
.s notifyViewChanged
, который запускает (синхронный) вызов onViewChanged
. onViewChanged
связывает все поля, отмеченные @ViewById
, , затем вызывает все методы, отмеченные @AfterViews
.
Следовательно, @ViewById
-аннотированные представления связаны и доступны для использования после вызова onViewCreated
, а @AfterViews
-аннотированные методы будут выполнены в конце onViewCreated
иперед любым другим методом жизненного цикла фрагмента.
В обоих наших примерах все привязки представлений выполняются в методе жизненного цикла, который происходит намного раньше, чем onResume, поэтому вы можете безопасно получить к ним доступ:)