ActionBarActivity和FragmentActivity中的setContentView

时间:2014-08-14 20:55:41

标签: android android-fragmentactivity android-support-library android-actionbaractivity

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

1 个答案:

答案 0 :(得分:1)

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

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

如果您在setContentView()之前致电onCreate(),那就是NPE的原因。

FragmentActivity,(或标准活动实际上)中,顺序并不重要,因为setContentView()并不依赖于可能已在{{1}中实例化的特定对象}}