在super.onCreate()中出现requestFeature()必须在添加内容之前调用的错误

29

我有一个继承自ActionBarActivity的抽象类。在onCreate中,我有以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    ...
}

应用程序由于在内容错误之前的requestFeature()而崩溃,具体表现为在super.onCreate(savedInstanceState)这一行。阅读了一些类似的帖子后,我想到了这个解决方案:

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    super.onCreate(savedInstanceState);
    ...
}
我的问题是:为什么在调用super时会崩溃?而且,在扩展此类的类中,我直到调用super.onCreate之后才设置 setContentView。但偶尔还是会崩溃。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.cycle.Cycle}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2351)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$600(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5454)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
at dalvik.system.NativeStart.main(Native Method)

Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:320)
at android.app.Activity.requestWindowFeature(Activity.java:3283)
at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:63)
at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
at com.myapp.core.activity.MyActivity.onCreate(MyActivity.java:83)
at com.myapp.cycle.Cycle.onCreate(Cycle.java:55)
at android.app.Activity.performCreate(Activity.java:5066)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
... 11 more

重现问题并发布您的logcat - Squonk
活动周期扩展了MyActivity。 - ono
可能会有一个内部隐藏的调用window.getDecorView的方法吗?这也会锁定功能:http://developer.android.com/reference/android/view/Window.html#getDecorView() - rupps
可能是 @rupps 说的那样。我不知道 ActionBarActivity 在幕后做了什么,但 ActionBarSherlock 基本上会用一个包含操作栏组件的布局来包装您的内容视图,因此我想 ActionBarActivity 也会做类似的事情。 - Karakuri
我没有调用 getDecorView()。我似乎无法复现它,这并没有帮助我找到解决方案。 - ono
1个回答

23

因为 android.support.v7.app.ActionBarActivity 通过添加 ActionBar 来更改窗口内容。
请查看以

开头的代码。

@Override
protected void onCreate(Bundle savedInstanceState) {
    mImpl = ActionBarActivityDelegate.createDelegate(this);
    super.onCreate(savedInstanceState);
    mImpl.onCreate(savedInstanceState);
}

请参阅https://android.googlesource.com/platform/frameworks/support/+/master/v7/appcompat/src/android/support/v7/app/ActionBarActivity.java了解详细信息。
FEATURE_INDETERMINATE_PROGRESS的外观取决于是否存在ActionBar。所以需要在调用super之前进行设置。


所以在你的答案中,在super.onCreate之前需要添加requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);吗? - ono
2
是的,requestWindowFeature总是必须首先调用。 - yanchenko
你能帮我吗?这个对我的情况没有用。http://stackoverflow.com/questions/27404146/when-orientation-changed-i-got-requestfeature-must-be-called-before-adding-con - Sasha
1
@yanchenko 这里的mlmpl是什么意思? - Sasha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接