android.util.AndroidRuntimeException:在添加内容之前必须调用requestFeature()

时间:2013-06-05 12:19:34

标签: java android

我收到此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);

LogCat

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

12 个答案:

答案 0 :(得分:175)

我也遇到过这个问题,但是当我在调用 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可见性更改的讨论,请参阅Responding to UI Visibility Changes,以便您的应用可以做出相应的响应。
  • 设置UI标志的地方有所不同。如果在活动的onCreate()方法中隐藏系统栏并且用户按下Home,系统栏将重新出现。当用户重新打开活动时,onCreate()将不会被调用,因此系统栏将保持可见。如果您希望系统UI更改在用户导入和导出活动时保持不变,请在onResume()或onWindowFocusChanged()中设置UI标记。
  • 方法setSystemUiVisibility()仅在您调用它的视图可见时才有效。
  • 导航离开视图会导致使用setSystemUiVisibility()设置的标志被清除。

答案 1 :(得分:12)

使用

时我得到了异常(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)

上的文档

因此,可能更多的是误导性错误消息,而不是其他任何内容。

答案 2 :(得分:7)

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

requestWindowFeature(Window.FEATURE_NO_TITLE);

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

super.onCreate() ...

之后

答案 3 :(得分:7)

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

答案 4 :(得分: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>

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

答案 5 :(得分:2)

我也从不同的工作流程遇到了这个错误。我创建了一个自定义的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函数的实现。

希望这可以帮助将来的某个人!

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

答案 6 :(得分:1)

我正在扩展 DialogFragment ,上述答案无效。我不得不使用getDialog()删除标题:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

答案 7 :(得分:1)

扩展(活动)而不是( ActionBarActivity

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

然后在onCreate写道:

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.Your_Activity);

答案 8 :(得分:0)

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

[RouteArea("Client")] 
public Class LoginController : Controller {
    [Route("register")]
    public ActionResult SignUp() {
        return View();
    }
}

答案 9 :(得分:0)

请尝试以下选项,其中至少一个应为您工作:

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

  2. 在活动中的supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)之前和setContentView(..)

  3. 之后尝试super.onCreate(..);
  4. super.onCreate(..);

  5. 之前尝试选项2

答案 10 :(得分:0)

放错行:  super.onCreate(savedInstanceState);

使用此方式:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qrscanner);

答案 11 :(得分:0)

我在update_code_signing_settings处遇到此错误,并且仅在调用 update_code_signing_settings( path: "./Build_iOS/Unity-iPhone.xcodeproj", use_automatic_signing: true, team_id: "TEAM ID", bundle_identifier: "BUNDLE ID", code_sign_identity: "iPhone Developer", targets: "Unity-iPhone" ) 时在API 19中才发生此错误。

弄清楚AlertDialog的导入是引起此问题的原因,所以我将其更改为dialog.show()并解决了该问题。

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