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


82

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

你能详细说明吗?我不知道“通过主题”是什么意思。
马特

您可以在清单中的活动标记下应用主题,例如android:theme =“ @ android:style / Theme.NoTitleBar.Fullscreen”,而不是在onCreate上编写Java代码。
vishesh chandra

Answers:


183

我也遇到了这个问题,但是当我在调用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标志的位置有所不同。如果您在活动的onCreate()方法中隐藏系统栏,并且用户按下Home键,系统栏将重新出现。当用户重新打开活动时,不会调用onCreate(),因此系统栏将保持可见。如果您希望系统UI更改在用户进入和离开您的活动时保持不变,请在onResume()或onWindowFocusChanged()中设置UI标志。
  • 方法setSystemUiVisibility()仅在从中调用的视图可见时才有效。
  • 从视图中导航会使使用setSystemUiVisibility()设置的标志被清除。

3
@clu必须在setContentView()之前调用此requestFeature(int featureId)。只要在setContentView()之前,可以多次调用它。如果不调用,将没有扩展功能。请求功能后,您将无法将其关闭。有关更多详细信息,请单击此处
vishesh chandra

2
我建议不要调用requestWindowFeature之前super.onCreate。在此之前,您无法确定活动的状态。
vbence

@vishesh chandra,在我的情况下,您能帮忙吗?这对我不起作用stackoverflow.com/questions/27404146/…–
Sasha

3
解决了问题,但标题栏仍然出现。
Aritra Roy 2014年

是的,对我来说操作栏仍然会出现
Parthiban M 2015年

15

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)上的文档

因此,比起其他任何情况,它更可能是误导性错误消息的情况。


1
也为我工作。我正在使用支持库v21中的ActionBarActivity。
cybergen

1
我正在使用appCompat,所以supportRequestWindowFeature花样对我也super.onCreate
有用

确保这曾经有效,因为这篇文章已有5年历史了,但仅供参考:Window.FEATURE_INDETERMINATE_PROGRESS自api与24版起已被弃用
Adam R. Turner

7

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


这是我的问题!我正在扩展AppCompatActivity,直到我切换到扩展Activity之前,requestWindowFeature(Window.FEATURE_NO_TITLE)无法成功隐藏标题栏。
Casey Murray

7

如果您将活动用作对话框(带有Theme.Dialog),则请确保扩展Activity而不是ActionBarActivity(Android Studio向导为您提供的默认设置)。那你可以用

requestWindowFeature(Window.FEATURE_NO_TITLE);

要么

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

在后super.onCreate()...


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函数的实现。

希望这对以后的人有所帮助!

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


1
老兄你救了我的一天!谢谢!:)
巴瑟姆·瓦萨

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>

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


1

我在延伸一个 DialogFragment,以上答案不起作用。我必须使用getDialog()删除标题:

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

1

扩展(Activity)而不是(ActionBarActivity

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

然后在onCreate中写:

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

0

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

  getActionBar().setTitle(null);

0

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

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

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

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


0

您的行放错了位置:super.onCreate(savedInstanceState);

使用此方式:

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

0

我有这个错误,AlertDialog并且仅在API 19中发生错误dialog.show()调用。

弄清楚android.app.AlertDialog导入是引起问题的原因,所以我将其更改为androidx.appcompat.app.AlertDialog并修复了该问题。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.