使用 AndroidAnnotations 库时何时注入视图?
When do views get injected when using the AndroidAnnotations library?
我想知道什么时候 @ViewById
-注解视图被注入到 AndroidAnnotations 中。基本上,我想知道在 onResume 期间访问这些视图之一是否安全?我假设它们是在 onCreate 期间注入的,但需要确认。
谢谢。
准确确定注入发生时间的最简单方法是检查 AndroidAnnotations 生成的代码。对于您的示例,我制作了一个简单的 Activity 和 Fragment,如下所示:
@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
强制AndroidAnnotations生成对应的类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
.
setContentView
调用 notifyViewChanged
,这会触发对 onViewChanged
. 的(同步)调用
onViewChanged
绑定所有用@ViewById
注释的字段,然后调用所有用@AfterViews
注释的方法。
因此,@ViewById
注解视图在onCreate
调用后绑定可用,@AfterViews
注解方法将在[=19]结束时执行=] 和任何其他 Activity 生命周期方法之前。
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
调用 notifyViewChanged
,这会触发对 onViewChanged
. 的(同步)调用
onViewChanged
绑定所有用@ViewById
注释的字段,然后调用所有用@AfterViews
注释的方法。
因此,@ViewById
-注解的视图在onViewCreated
被调用后被绑定并可用,并且@AfterViews
-注解的方法将在[=39]结束时执行=] 并且在任何其他 Fragment 生命周期方法之前。
在我们的两个示例中,所有视图绑定都是在比 onResume 早得多的生命周期方法中执行的,因此您可以安全地在那里访问它们:)
我想知道什么时候 @ViewById
-注解视图被注入到 AndroidAnnotations 中。基本上,我想知道在 onResume 期间访问这些视图之一是否安全?我假设它们是在 onCreate 期间注入的,但需要确认。
谢谢。
准确确定注入发生时间的最简单方法是检查 AndroidAnnotations 生成的代码。对于您的示例,我制作了一个简单的 Activity 和 Fragment,如下所示:
@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
强制AndroidAnnotations生成对应的类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
.setContentView
调用notifyViewChanged
,这会触发对onViewChanged
. 的(同步)调用
onViewChanged
绑定所有用@ViewById
注释的字段,然后调用所有用@AfterViews
注释的方法。
因此,@ViewById
注解视图在onCreate
调用后绑定可用,@AfterViews
注解方法将在[=19]结束时执行=] 和任何其他 Activity 生命周期方法之前。
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
调用notifyViewChanged
,这会触发对onViewChanged
. 的(同步)调用
onViewChanged
绑定所有用@ViewById
注释的字段,然后调用所有用@AfterViews
注释的方法。
因此,@ViewById
-注解的视图在onViewCreated
被调用后被绑定并可用,并且@AfterViews
-注解的方法将在[=39]结束时执行=] 并且在任何其他 Fragment 生命周期方法之前。
在我们的两个示例中,所有视图绑定都是在比 onResume 早得多的生命周期方法中执行的,因此您可以安全地在那里访问它们:)