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

자세히 설명해 주시겠습니까? 나는 "테마를 통해"가 무슨 뜻인지 모르겠다.
Matt

onCreate에서 Java 코드를 작성하는 대신 android : theme = "@ android : style / Theme.NoTitleBar.Fullscreen" 과 같은 활동 태그 아래 Manifest에서 테마를 적용 할 수 있습니다 .
vishesh chandra 2013 년

답변:


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이 requestFeature (int featureId) 는 setContentView () 전에 호출되어야합니다. setContentView () 이전에 원하는만큼 여러 번 호출 할 수 있습니다. 호출하지 않으면 확장 기능을 사용할 수 없습니다. 요청 된 기능은 끌 수 없습니다. 자세한 내용은 여기를 클릭
vishesh 찬드라

2
나는 requestWindowFeature전에 전화하지 않는 것이 super.onCreate좋습니다. 그 시점 이전의 활동 상태에 대해 확신 할 수 없습니다.
vbence 2013 년

@vishesh 찬드라 당신은 도움 내 경우에는이 나를 위해 일하지 않는 수 stackoverflow.com/questions/27404146/...
사샤

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 2014 년

1
내가 사용하고 appCompat그래서 supportRequestWindowFeature나를 위해 트릭을했고, 내가 전에 넣어 필요가 없었어요super.onCreate
최대 Koretskyi

확실히 이것은 단지 참고하시기 바랍니다이 게시물은 5 세 이후 작업에 사용하지만, : Window.FEATURE_INDETERMINATE_PROGRESS이 API를 대 24로 사용되지 않습니다
아담 R. 터너를

7

클래스가 Activity 또는 ActionBarActivity에서 확장되었는지 확인하십시오. ActionBarActivity를 사용하는 경우 Activity를 사용하십시오.


이것은 내 문제였습니다! AppCompatActivity를 확장하고 있었고 requestWindowFeature (Window.FEATURE_NO_TITLE)는 Activity 확장으로 전환 할 때까지 제목 표시 줄을 숨기는 데 성공하지 못했습니다.
Casey Murray

7

활동을 Dialog (Theme.Dialog 포함)로 사용하는 경우 ActionBarActivity (Android Studio 마법사를 통해 제공되는 기본값) 대신 Activity를 확장해야합니다. 그런 다음 사용할 수 있습니다

requestWindowFeature(Window.FEATURE_NO_TITLE);

또는

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

super.onCreate()...


3

또한 다른 워크 플로에서이 오류가 발생했습니다. 사용자 지정 DialogFragment 클래스를 만들고 @OverrideonCreateView 및 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에서 미리 정의 된 Positive / Negative 버튼을 사용하기를 원했기 때문에 두 가지 재정의를 모두 구현하는 데 어려움이 있음을 깨달았습니다. 내 솔루션은 내 사용자 지정 대화 상자보기에서 양수 / 음수 버튼을 만드는 것이었기 때문에 Override onCreateDialog 함수 구현을 삭제했습니다.

이것이 미래의 누군가에게 도움이되기를 바랍니다!

저에게 도움이 된 몇 가지 질문이 있습니다.


1
넌 내 하루를 구해 줬어! 감사합니다! :)
Bassem Wissa

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

( ActionBarActivity ) 대신 ( Activity ) 확장

예: 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를 사용하는 경우 다음 방법을 모두 오버라이드 (override)하지 않으려 고 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 버전을 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.