Android ActionBarActivity和FragmentActivity中的setContentView
在FragmentActivity中,super.onCreate和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
//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
。