在Fragment中添加内容之前必须调用requestFeature()

时间:2014-09-26 05:57:29

标签: android fragment android-actionbar-compat

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

使用

时出现此错误
getActivity().getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

来自片段。 我想仅在此片段中更改操作栏样式。所以我不能在MainActivity中设置它。怎么解决这个问题?

我看到了这个问题requestFeature() must be called before adding content它没有说明如何从片段中解决这个问题

5 个答案:

答案 0 :(得分:5)

我也遇到了这个错误,使用了DialogFragment,尽管我根本没有调用requestFeature()。

我从DialogFragment的onActivitiyCreate()调用了getDecorView()作为我编写的一些跟踪代码的一部分,以帮助我了解Windows的创建方式和时间。这样做很好,但是在片段的生命周期稍后,它的onStart()方法被调用了。这称为Dialog的show()最终调用了AlertDialog的onCreate(),最终调用了PhoneWindow的requestFeature()方法来请求Window.FEATURE_NO_TITLE。

自从第一次调用getDecorView()"'锁定'各种窗口特性,如setContentView(View,android.view.ViewGroup.LayoutParams)中描述的那样。",这违反了在Fragment"中添加内容之前调用" requestFeature()的要求。 - 通过调用getDecorView()来间接添加内容的微妙之处。

修复是调用peekDecorView()而不是getDecorView()。

答案 1 :(得分:4)

无论人们如何回应,如果您将AppCompatActivity用作活动的父级,则仍会出现此问题。

对我来说,这段代码会抛出错误:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.activity_browser);
}
  • 测试1:MyActivity extends Activity ==>工作
  • 测试2:MyActivity extends AppCompatActivity ==>错误"在添加活动"
  • 中的内容之前,必须调用requestFeature()

测试2的解决方案(如果您使用的是Appcompat)是在 requestFeature之前调用super.onCreate 。它会解决你的问题。

答案 2 :(得分:1)

您必须在活动的getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);方法中setContentView()之前致电onCreate()。您必须在FragmentActivity的{​​{1}}中添加此行。

答案 3 :(得分:1)

应在您的活动中requestFeature()之前调用

setContentView()。 从Fragment调用getActivity().getWindow().requestFeature()是不好的做法。如果您希望延迟操作栏的可见性,我建议您在活动的onCreate()中隐藏操作栏。在片段onViewCreated()中取消隐藏。

答案 4 :(得分:1)

您需要为此片段创建单独的Activity,然后在setContentView()之前对该活动创建requestFeature(),因为requestFeature()是android.view.Window的方法。窗口功能适用于特定活动。您可以操纵特定活动的窗口行为而非特定片段。