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

时间:2010-11-22 20:54:07

标签: android android-layout android-activity

我正在尝试实现自定义标题栏:

这是我的助手课程:

import android.app.Activity;
import android.view.Window;

public class UIHelper {
    public static void setupTitleBar(Activity c) {
        final boolean customTitleSupported = c.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

        c.setContentView(R.layout.main);

        if (customTitleSupported) {
            c.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
        }
    }
}

这是我在onCreate()中调用的地方:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setupUI();
}

private void setupUI(){
     setContentView(R.layout.main);
     UIHelper.setupTitleBar(this);
}

但我收到错误:

requestFeature() must be called before adding content

8 个答案:

答案 0 :(得分:320)

好吧,只需执行错误消息告诉您的内容。

请勿在{{1​​}}之前致电setContentView()

注意:

如评论中所述,对于requestFeature()ActionBarSherlock库,有必要在AppCompat

之前致电requestFeature()

答案 1 :(得分:23)

我知道它已经超过一年了,但是调用requestFeature()从未解决我的问题。事实上,我根本不打电话。

我认为这是一个夸大观点的问题。尽管我都在寻找,但在我使用不同的方法来充气视图之前,我从未找到合适的解决方案。

AlertDialog.Builder是一个简单的解决方案,但如果您使用onPrepareDialog()更新该视图,则需要大量工作。

另一种方法是利用AsyncTask进行对话。

我使用的最终解决方案如下:

public class CustomDialog extends AlertDialog {

   private View content;

   public CustomDialog(Context context) {
       super(context);

       LayoutInflater li = LayoutInflater.from(context);
       content = li.inflate(R.layout.custom_view, null);

       setUpAdditionalStuff(); // do more view cleanup
       setView(content);           
   }

   private void setUpAdditionalStuff() {
       // ...
   }

   // Call ((CustomDialog) dialog).prepare() in the onPrepareDialog() method  
   public void prepare() {
       setTitle(R.string.custom_title);
       setIcon( getIcon() );
       // ...
   }
}

*一些附加说明:

  1. 不要依赖隐藏标题。尽管没有设置标题,但通常会有空的空间。
  2. 不要尝试使用页眉页脚和中间视图构建自己的视图。尽管请求FEATURE_NO_TITLE,但如上所述,标题可能无法完全隐藏。
  3. 不要使用颜色属性或文字大小对内容视图进行大量设置。让对话框处理,否则你冒险将黑色文本放在深蓝色对话框上,因为供应商颠倒了颜色。

答案 2 :(得分:11)

我正在扩展 DialogFragment ,上述答案无效。我不得不使用getDialog()来删除标题:

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

答案 3 :(得分:2)

错误是不是确切地告诉你什么是错的?在您致电requestWindowFeature后,您正在呼叫setFeatureIntsetContentView

顺便问一下,你为什么要两次打电话给setContentView

答案 4 :(得分:1)

对于SDK版本23及更高版本,如果您使用AppCompatActivity扩展活动,则会引发相同的RuntimeException。如果您的活动直接来自活动,则不会发生。

这是谷歌的一个已知问题,如https://code.google.com/p/android/issues/detail?id=186440

中所述

为此提供的解决方法是使用supportRequestWindowFeature()方法而不是使用requestFeature()。

如果它解决了你的问题,请提前投票。

答案 5 :(得分:1)

编译SDK版本目标SDK版本更改为构建工具版本 24.0.0 < strong> build.gradle 如果您在请求功能中面临问题

答案 6 :(得分:0)

在我的情况下,我在DialogFragment中显示了Activity。在此对话框片段中,我的写法如DialogFragment remove black border

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(STYLE_NO_FRAME, 0)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val dialog = Dialog(context!!, R.style.ErrorDialogTheme)
    val inflater = LayoutInflater.from(context)
    val view = inflater.inflate(R.layout.fragment_error_dialog, null, false)
    dialog.setTitle(null)
    dialog.setCancelable(true)
    dialog.setContentView(view)
    return dialog
}

要么删除setStyle(STYLE_NO_FRAME, 0)中的onCreate(),要么唱/删除onCreateDialog。因为创建对话框后对话框设置已更改。

答案 7 :(得分:0)

基于扩展的DialogFragment的Dialogs存在此问题,该对话框在运行API 26的设备上可以正常运行,但在API 23上失败。上述策略不起作用,但我通过删除onCreateView方法解决了该问题(已添加了onCreateView方法)对话框片段中创建新对话框),然后在onCreateDialog中创建对话框。