83

我收到这个android.util.AndroidRuntimeException: requestFeature() must be called before adding content错误。正如您在下面的代码中看到的那样,该行位于代码requestWindowFeature(Window.FEATURE_NO_TITLE);行之前setContentView(R.layout.mainmenu);。这个 onCreate() 代码几乎在我的每一个活动中都是相同的格式,直到现在我从来没有遇到过问题。自从我更新到 ADT 22 以来,到处都出现了很多随机错误。我已经清除了很多这些错误,这是我最新的一个。

我能做些什么来解决这个错误?

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.mainmenu);

日志猫

05-31 04:20:43.121: E/AndroidRuntime(14559): FATAL EXCEPTION: main
05-31 04:20:43.121: E/AndroidRuntime(14559): java.lang.RuntimeException: Unable to start activity ComponentInfo{matt.lyons.bibletrivia.lite/matt.lyons.bibletrivia.lite.MainMenu}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.os.Looper.loop(Looper.java:137)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.main(ActivityThread.java:5041)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at java.lang.reflect.Method.invokeNative(Native Method)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at java.lang.reflect.Method.invoke(Method.java:511)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at dalvik.system.NativeStart.main(Native Method)
05-31 04:20:43.121: E/AndroidRuntime(14559): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
05-31 04:20:43.121: E/AndroidRuntime(14559):    at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:229)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Activity.requestWindowFeature(Activity.java:3244)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at matt.lyons.bibletrivia.lite.MainMenu.onCreate(MainMenu.java:28)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Activity.performCreate(Activity.java:5104)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-31 04:20:43.121: E/AndroidRuntime(14559):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
05-31 04:20:43.121: E/AndroidRuntime(14559):    ... 11 more
4

12 回答 12

188

我也遇到过这个问题,但是当我在调用super.onCreate()之前调用窗口请求时,问题就解决了,请尝试一下。

@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainmenu);
}

希望对你有帮助...:)


已编辑:对于 Android 新版本的其他可能解决方案

在 Android 4.0 及更低版本上隐藏状态栏

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

使用活动主题的优点如下:

  • 与以编程方式设置标志相比,它更易于维护且不易出错。
  • 它会导致更平滑的 UI 转换,因为系统在实例化应用程序的主要活动之前具有呈现 UI 所需的信息。

Android版本低于Jellybean

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // If the Android version is lower than Jellybean, use this call to hide
    // the status bar.
    if (Build.VERSION.SDK_INT < 16) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    setContentView(R.layout.activity_main);
}

在 Android 4.1 及更高版本上隐藏状态栏

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

请注意以下事项:

  • 一旦 UI 标志被清除(例如,通过导航离开活动),如果您想再次隐藏这些栏,您的应用需要重置它们。请参阅响应 UI 可见性更改以讨论如何侦听 UI 可见性更改,以便您的应用程序可以做出相应的响应。
  • 在哪里设置 UI 标志会有所不同。如果您在 Activity 的 onCreate() 方法中隐藏系统栏并且用户按下 Home,系统栏将重新出现。当用户重新打开活动时,不会调用 onCreate(),因此系统栏将保持可见。如果您希望系统 UI 更改在用户导航进出您的活动时保持不变,请在 onResume() 或 onWindowFocusChanged() 中设置 UI 标志。
  • 方法 setSystemUiVisibility() 仅在您调用它的视图可见时才有效。
  • 离开视图会导致使用 setSystemUiVisibility() 设置的标志被清除。
于 2013-06-05T12:28:10.857 回答
14

使用时出现异常(android.util.AndroidRuntimeException: requestFeature() must be called before adding content

requestWindowFeature(Window.FEATURE_NO_TITLE);

在运行 Android 2.3.5 (Gingerbread) 的旧设备中。我正在使用 v7 支持库。

当我将其更改为使用时,该错误已修复:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(这也发生在我在修复中调用 super.onCreate 之后)。请参阅https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)上的文档

因此,这可能更像是一个误导性错误消息的情况,而不是其他任何事情。

于 2014-08-12T09:48:31.193 回答
7

请检查您的课程是否从 Activity 或 ActionBarActivity 扩展。如果您使用的是 ActionBarActivity,请使用 Activity。

于 2015-04-20T14:01:18.830 回答
7

如果您将 Activity 用作 Dialog(使用 Theme.Dialog),请确保扩展 Activity 而不是 ActionBarActivity(Android Studio 向导为您提供的默认值)。然后你可以使用

requestWindowFeature(Window.FEATURE_NO_TITLE);

或者

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

之后super.onCreate()...

于 2015-02-26T05:12:40.910 回答
3

我也从不同的工作流程中遇到了这个错误。我创建了一个自定义 DialogFragment 类并创建了两个@Override函数 - onCreateView 和 onCreateDialog。我的 onCreateView 函数获取了片段的自定义布局,我的 onCreateDialog 函数创建了一个 AlertDialog.Builder。

这似乎不起作用,因为在 onCreateView 之前调用了 onCreateDialog。在我删除 onCreateView [通过将我的自定义视图膨胀移动到 onCreateDialog 后,我遇到了错误:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

我意识到我的困难来自尝试实现这两种覆盖,因为我想 1)为对话框的主视图使用布局,以及 2)使用 Builder 预定义的正/负按钮。我的解决方案是在自定义对话框视图中创建正/负按钮,因此我删除了 Override onCreateDialog 函数的实现。

希望这对将来的人有所帮助!

以下是一些对我有帮助的问题:

于 2016-07-19T18:39:43.113 回答
2

我正在扩展一个DialogFragment并且上面的答案不起作用。我不得不使用 getDialog() 来删除标题:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
于 2014-06-23T10:15:42.170 回答
2

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowActionBar">false</item>

    </style>

只需设置这样的样式,不需要任何编码方面的更改。

于 2016-02-03T05:18:03.087 回答
1

扩展 ( Activity ) 而不是 ( ActionBarActivity )

例子:public class Itemdetails extends Activity {....

然后在 onCreate 中写:

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.Your_Activity);
于 2015-11-05T15:10:01.690 回答
0

放错了行: super.onCreate(savedInstanceState);

使用这种方式:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qrscanner);
于 2019-07-31T05:23:40.833 回答
0

我认为最简单的方法是使用下面的代码

  getActionBar().setTitle(null);
于 2016-08-19T09:15:50.003 回答
0

请尝试以下选项,其中至少一个应该适合您:

  1. 如果您使用的是 DialogFragment,请尝试不要覆盖这两种方法onCreateDialog(..)onCreateView(..) (此更改对我有用)

  2. supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)在活动之前setContentView(..)和之后尝试super.onCreate(..);

  3. 之前尝试选项 2super.onCreate(..);

于 2019-02-15T18:26:10.083 回答
0

我遇到了这个错误,AlertDialog并且只有在调用 API 19 时才会发生错误dialog.show()

发现android.app.AlertDialog导入导致问题,所以我将其更改为androidx.appcompat.app.AlertDialog并修复它。

请注意,如果您使用的是 androidx,这将起作用。如果不是,则应使用该导入的旧 appcompat 版本。

于 2020-09-09T13:01:51.077 回答