Android ActionBarActivity和FragmentActivity中的setContentView

Android ActionBarActivity和FragmentActivity中的setContentView,android,android-fragmentactivity,android-support-library,android-actionbaractivity,Android,Android Fragmentactivity,Android Support Library,Android Actionbaractivity,在FragmentActivity中,super.onCreate和setContentView的顺序并不重要,为什么 碎片活动 //OK @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_waiting_for_confirmation_order); } //O

在FragmentActivity中,super.onCreate和setContentView的顺序并不重要,为什么

碎片活动

//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);
}

原因是
ActionBarActivity
(来自support-v7)正在使用委托对象来使用实际实现或compat实现

此委托在
ActionBarActivity
的onCreate()方法中实例化,而ActionBarActivity的
setContentView()
方法只是执行
delegate.setContentView()

这就是为什么在
onCreate()之前调用
setContentView()
时会出现NPE


FragmentActivity
(实际上是标准活动)中,顺序并不重要,因为
setContentView()
不依赖于可以在
onCreate()
中实例化的特定对象,如果您查看
ActionBarActivity的
源代码,您将看到它在内部使用了`ActionBarActivityDelegate`实例—这是在
ActionBarActivity\onCreate()中初始化的。因此,如果在
super.onCreate(…)
之前调用
setContentView(…)
,则会发生
NullPointerException
,因为
setContentView(…)
调用
ActionBarActivityDelegate\setContentView(layoutResID)=>和
ActionBarActivityDelegate
实例此时为
null