在FragmentActivity中,super.onCreate和setContentView的顺序并不重要,为什么?
FragmentActivity
//OK
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_waiting_for_confirmation_order);
}
//OK
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_waiting_for_confirmation_order);
super.onCreate(savedInstanceState);
}
但在ActionBarActivity中,它会抛出NullPointerException。
ActionBarActivity
//OK
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_waiting_for_confirmation_order);
}
//ERROR
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_waiting_for_confirmation_order); //NullPointerException
super.onCreate(savedInstanceState);
}
答案 0 :(得分:1)
原因是ActionBarActivity
(来自support-v7)使用委托对象来使用真实实现或compat实现。
此委托在ActionBarActivity
的onCreate()方法中实例化,ActionBarActivity的方法setContentView()
只是delegate.setContentView()
。
如果您在setContentView()
之前致电onCreate()
,那就是NPE的原因。
在FragmentActivity
,(或标准活动实际上)中,顺序并不重要,因为setContentView()
并不依赖于可能已在{{1}中实例化的特定对象}}