Jithin Sunny
Jithin Sunny

Reputation: 3402

requestFeature() must be called before adding content in Fragment

android.util.AndroidRuntimeException: requestFeature() must be called before adding content

I get this error when i use

getActivity().getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

from fragment. I want to change actionbar style only in this fragment. So I can't set this in MainActivity. How to solve this?

I saw this question requestFeature() must be called before adding content it does not say how to solve this issue from a fragment

Upvotes: 16

Views: 13585

Answers (5)

Irfan Raza
Irfan Raza

Reputation: 2963

Regardless of whatever people are responding this issues still appear if you use AppCompatActivity as a parent to your activity.

For me this code throws error: ​

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.activity_browser);
}
  • Test 1 : MyActivity extends Activity ==> Worked
  • Test 2 : MyActivity extends AppCompatActivity ==> Error "requestFeature() must be called before adding content in activity"

The solution for Test 2 (if you are using Appcompat) is to call requestFeature before super.onCreate. It would solve your issue.

Upvotes: 6

Barry Holroyd
Barry Holroyd

Reputation: 1105

I also got this error, working with a DialogFragment, even though I wasn't calling requestFeature() at all.

I was calling getDecorView() from the DialogFragment's onActivitiyCreate() as part of some tracing code I had written to help me understand how and when Windows are created. That worked fine, but a bit later in the fragment's life cycle its onStart() method was called. That called Dialog's show() which eventually called AlertDialog's onCreate() which eventually called PhoneWindow's requestFeature() method to request Window.FEATURE_NO_TITLE.

Since calling getDecorView() "for the first time 'locks in' various window characteristics as described in setContentView(View, android.view.ViewGroup.LayoutParams).", this violated the requirement that "requestFeature() gets called before adding content in Fragment" -- the subtlety being that the content was getting added indirectly by my call to getDecorView().

The fix was to call peekDecorView() instead of getDecorView().

Upvotes: 7

Umair Khan
Umair Khan

Reputation: 193

You need to create a separate Activity for this fragment and then requestFeature() on that activity before setContentView() because requestFeature() is method of android.view.Window. Window features are for the specific activity. You can manipulate the window behaviors for a specific activity not specific fragment.

Upvotes: 2

Akhil
Akhil

Reputation: 6697

requestFeature() should be called before setContentView() in your activity. Calling getActivity().getWindow().requestFeature() from Fragment is bad practice. If you want your action bar visibility to be delayed, i will recommend to hide actionbar in onCreate() of your activity & unhide it in onViewCreated() in your fragment.

Upvotes: 2

Piyush
Piyush

Reputation: 18923

You have to call getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); before the setContentView() in the Activity's onCreate() method. You have to add this line in your FragmentActivity from where your Fragment is being called.

Upvotes: 2

Related Questions