android.util.AndroidRuntimeException: requestFeature () phải được gọi trước khi thêm nội dung


82

Tôi đang nhận được android.util.AndroidRuntimeException: requestFeature() must be called before adding contentlỗi này . Như bạn có thể thấy trong đoạn mã dưới đây, requestWindowFeature(Window.FEATURE_NO_TITLE);dòng này đứng trước setContentView(R.layout.mainmenu);dòng mã. Mã onCreate () này có cùng định dạng trong mọi hoạt động của tôi và tôi chưa bao giờ gặp sự cố với nó trước đây cho đến bây giờ. Kể từ khi tôi cập nhật lên ADT 22, rất nhiều lỗi ngẫu nhiên đã xuất hiện ở khắp mọi nơi. Tôi đã khắc phục rất nhiều lỗi đó và đây là lỗi mới nhất của tôi.

Tôi có thể làm gì để khắc phục lỗi này?

@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

Bạn có thể xây dựng? Tôi không biết "thông qua chủ đề" có nghĩa là gì.
Matt,

Bạn có thể áp dụng chủ đề trong Manifest dưới thẻ hoạt động như, android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" thay vì viết mã java trong onCreate.
vishesh chandra

Câu trả lời:


183

Tôi cũng gặp phải vấn đề này nhưng khi tôi gọi yêu cầu cửa sổ trước khi gọi super.onCreate () thì vấn đề đã được giải quyết, hãy thử nó cũng giống như ..

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

Hy vọng điều này sẽ giúp bạn...:)


Đã chỉnh sửa: Để biết các giải pháp khả thi khác cho các phiên bản mới của Android

Ẩn thanh trạng thái trên Android 4.0 trở xuống

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

Những lợi thế của việc sử dụng một chủ đề hoạt động như sau:

  • Việc duy trì dễ dàng hơn và ít bị lỗi hơn việc đặt cờ theo chương trình.
  • Nó dẫn đến chuyển đổi giao diện người dùng mượt mà hơn, vì hệ thống có thông tin cần thiết để hiển thị giao diện người dùng của bạn trước khi khởi tạo hoạt động chính của ứng dụng của bạn.

Phiên bản Android thấp hơn 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);
}

Ẩn thanh trạng thái trên Android 4.1 trở lên

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();

Lưu ý những điều dưới đây:

  • Sau khi các cờ giao diện người dùng đã bị xóa (ví dụ: bằng cách điều hướng khỏi hoạt động), ứng dụng của bạn cần đặt lại chúng nếu bạn muốn ẩn lại các thanh. Xem phần Phản hồi với các thay đổi về mức hiển thị giao diện người dùng để thảo luận về cách lắng nghe các thay đổi về mức hiển thị giao diện người dùng để ứng dụng của bạn có thể phản hồi phù hợp.
  • Nơi bạn đặt cờ giao diện người dùng sẽ tạo ra sự khác biệt. Nếu bạn ẩn các thanh hệ thống trong phương thức onCreate () của hoạt động và người dùng nhấn Trang chủ, các thanh hệ thống sẽ xuất hiện lại. Khi người dùng mở lại hoạt động, onCreate () sẽ không được gọi, vì vậy các thanh hệ thống sẽ vẫn hiển thị. Nếu bạn muốn các thay đổi về giao diện người dùng hệ thống vẫn tiếp diễn khi người dùng điều hướng vào và ra khỏi hoạt động của bạn, hãy đặt cờ giao diện người dùng trong onResume () hoặc onWindowFocusChanged ().
  • Phương thức setSystemUiVisibility () chỉ có tác dụng nếu chế độ xem bạn gọi nó từ đó hiển thị.
  • Điều hướng khỏi chế độ xem khiến các cờ được đặt bằng setSystemUiVisibility () bị xóa.

3
@clu Yêu cầu nàyFeature (int featureId) phải được gọi trước setContentView (). Có thể được gọi bao nhiêu lần tùy thích miễn là trước setContentView (). Nếu không được gọi, sẽ không có tính năng mở rộng nào khả dụng. Bạn không thể tắt một tính năng khi nó được yêu cầu. Để cụ thể hơn bấm vào đây
Chandra Vishesh

2
Tôi khuyên bạn không nên gọi requestWindowFeaturetrước đây super.onCreate. Bạn không thể chắc chắn về trạng thái của Hoạt động trước thời điểm đó.
vbence

@vishesh chandra bạn có thể giúp gì trong trường hợp của tôi, điều này không hiệu quả với tôi stackoverflow.com/questions/27404146/…
Sasha

3
Đã giải quyết sự cố nhưng thanh tiêu đề vẫn xuất hiện.
Aritra Roy

Vâng, đối với tôi, thanh hành động vẫn xuất hiện
Parthiban M

15

Tôi có ngoại lệ đó ( android.util.AndroidRuntimeException: requestFeature() must be called before adding content) khi sử dụng

requestWindowFeature(Window.FEATURE_NO_TITLE);

trong một thiết bị cũ hơn chạy Android 2.3.5 (Gingerbread). Tôi đang sử dụng thư viện hỗ trợ v7.

Lỗi đã được sửa khi tôi thay đổi nó để sử dụng:

supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

(Điều này xảy ra sau cuộc gọi super.onCreate của tôi trong bản sửa lỗi). Xem tài liệu tại https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#supportRequestWindowFeature(int)

Vì vậy, nó có thể là một trường hợp thông báo lỗi gây hiểu nhầm hơn bất cứ điều gì khác.


1
Cũng làm việc cho tôi. Tôi đang sử dụng ActionBarActivity từ thư viện hỗ trợ v21.
cybergen

1
Tôi đang sử dụng appCompatvà do đó supportRequestWindowFeatuređã làm các trick cho tôi và tôi không cần phải đặt nó trướcsuper.onCreate
Max Koretskyi

chắc chắn rằng điều này đã từng hoạt động vì bài đăng này đã được 5 năm tuổi, nhưng chỉ fyi: Window.FEATURE_INDETERMINATE_PROGRESS không được dùng nữa kể từ api so với 24
Adam R. Turner

7

Vui lòng kiểm tra lớp học của bạn được mở rộng từ Activity hoặc ActionBarActivity. Nếu bạn đang sử dụng ActionBarActivity, vui lòng sử dụng Activity.


Đây là vấn đề của tôi! Tôi đang mở rộng AppCompatActivity và requestWindowFeature (Window.FEATURE_NO_TITLE) đã không thành công trong việc ẩn thanh tiêu đề cho đến khi tôi chuyển sang mở rộng Hoạt động.
Casey Murray

7

Nếu bạn đang sử dụng hoạt động của mình dưới dạng Hộp thoại (với Theme.Dialog), thì hãy đảm bảo bạn mở rộng Hoạt động thay vì ActionBarActivity (mặc định được cung cấp cho bạn với trình hướng dẫn Android Studio). Sau đó, bạn có thể sử dụng

requestWindowFeature(Window.FEATURE_NO_TITLE);

hoặc là

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

SAU super.onCreate()...


3

Tôi cũng gặp phải lỗi này từ một quy trình làm việc khác. Tôi đã tạo một lớp DialogFragment tùy chỉnh và tôi đã tạo hai @Overridehàm - onCreateView và onCreateDialog. Hàm onCreateView của tôi đã lấy một bố cục tùy chỉnh cho phân đoạn và hàm onCreateDialog của tôi đã tạo một AlertDialog.Builder.

Điều này dường như không hoạt động vì onCreateDialog được gọi trước onCreateView. Sau khi tôi xóa onCreateView [bằng cách chuyển chế độ xem tùy chỉnh của tôi vào onCreateDialog, tôi đã gặp lỗi:

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

Tôi nhận ra khó khăn của mình đến từ việc cố gắng thực hiện cả hai ghi đè vì tôi muốn 1) sử dụng bố cục cho chế độ xem chính của hộp thoại và 2) sử dụng các nút Dương / Phủ định được xác định trước của Builder. Giải pháp của tôi là tạo các nút tích cực / tiêu cực trong chế độ xem hộp thoại tùy chỉnh, vì vậy tôi đã xóa việc triển khai chức năng Ghi đè onCreateDialog của mình.

Mong rằng điều này sẽ giúp ai đó trong tương lai!

Dưới đây là một số câu hỏi SO đã giúp tôi:


1
dude bạn đã cứu ngày của tôi! Cảm ơn bạn! :)
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>

chỉ cần thiết lập kiểu như thế này mà không cần bất kỳ thay đổi bên mã hóa nào.


1

Tôi đang mở rộng DialogFragment và câu trả lời ở trên không hoạt động. Tôi đã phải sử dụng getDialog () để xóa tiêu đề:

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

1

Mở rộng ( Hoạt động ) thay vì ( ActionBarActivity )

thí dụ: public class Itemdetails extends Activity {....

thì trong onCreate viết:

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

0

tôi nghĩ cách đơn giản nhất để làm điều này là sử dụng đoạn mã dưới đây

  getActionBar().setTitle(null);

0

Vui lòng thử các tùy chọn sau, ít nhất một trong những tùy chọn này sẽ phù hợp với bạn:

  1. Nếu bạn đang sử dụng DialogFragment, hãy thử không ghi đè cả hai phương pháp onCreateDialog(..)onCreateView(..) (Thay đổi này phù hợp với tôi)

  2. thử supportRequestWindowFeature(Window.FEATURE_NO_TITLE)/requestWindowFeature(Window.FEATURE_NO_TITLE)trước setContentView(..)trong hoạt động và sausuper.onCreate(..);

  3. Hãy thử tùy chọn 2 trước super.onCreate(..);


0

Đặt sai dòng của bạn: super.onCreate (saveInstanceState);

sử dụng Manner này:

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

0

Tôi đã gặp lỗi này AlertDialogvà lỗi chỉ xảy ra trong API 19 khidialog.show() được gọi.

phát hiện ra rằng quá trình android.app.AlertDialognhập đang gây ra sự cố vì vậy tôi đã thay đổi nó thành androidx.appcompat.app.AlertDialogvà nó đã khắc phục sự cố.

Lưu ý rằng điều này sẽ hoạt động nếu bạn đang sử dụng androidx. nếu không, bạn nên sử dụng phiên bản appcompat cũ của lần nhập đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.