代码之家  ›  专栏  ›  技术社区  ›  Sheehan Alam

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

  •  131
  • Sheehan Alam  · 技术社区  · 14 年前

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

    这是我的助手课程:

    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 回复  |  直到 11 年前
        1
  •  325
  •   Sankar V    10 年前

    好吧,按照错误信息告诉你的去做。

    不要打电话 setContentView() 之前 requestFeature() .

    注:

    正如评论中所说 ActionBarSherlock AppCompat 图书馆,有必要打电话 请求功能() 之前 super.onCreate()

        2
  •  23
  •   Al Lelopath    10 年前

    我知道已经一岁多了,但是打电话来 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. 不要用颜色属性或文本大小来重设内容视图的样式。让对话框来处理这个问题,另一个明智的做法是,你可以冒险在深蓝色的对话框上放置黑色文本,因为供应商会反转颜色。
        3
  •  14
  •   Illegal Argument    11 年前

    我在扩展 对话片段 上面的答案不起作用。我不得不使用getDialog()来实现删除标题:

    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    
        4
  •  2
  •   EboMike    14 年前

    这个错误不正是告诉你出了什么事吗?你在打电话 requestWindowFeature setFeatureInt 在你打电话之后 setContentView .

    顺便问一下,你为什么打电话来 设置内容视图 两次?

        5
  •  1
  •   Keshav Bansal    9 年前

    对于SDK version 23及更高版本,如果使用AppCompatActivity扩展活动,则会引发相同的运行时异常。如果你的活动直接源于活动,那么它就不会发生。

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

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

    如果它能解决你的问题,请投赞成票。

        6
  •  1
  •   Jaichander    9 年前

    更改 编译SDK版本 , 目标SDK版本 生成工具版本 24.0.0版 在里面 build.gradle公司 如果您在请求功能中遇到问题

        7
  •  0
  •   CoolMind    6 年前

    在我的案例中我展示了 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 . 因为在创建对话框后,对话框设置已更改。

        8
  •  0
  •   BillC    6 年前

    基于扩展的DialogFragment的对话框出现了这个问题,它在运行API 26的设备上运行良好,但在API 23上失败。上面的策略不起作用,但我通过从DialogFragment中删除onCreateView方法(由更新的Android Studio模板添加)并在onCreateDialog中创建对话框来解决了这个问题。