1

在 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。

动作栏活动

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

1 回答 1

1

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

这个委托是在 onCreate() 的方法中实例化的,ActionBarActivityActionBarActivity的方法setContentView()只是在做delegate.setContentView()

这就是为什么如果你setContentView()之前打电话会出现 NPE 的原因onCreate()

FragmentActivity, (或实际上是标准 Activity )中,顺序无关紧要,因为setContentView()它不依赖于可以在onCreate().

于 2014-08-14T21:07:47.460 回答