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

She*_*lam 134 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

private void setupUI(){
     setContentView(R.layout.main);
     UIHelper.setupTitleBar(this);
}
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

requestFeature() must be called before adding content
Run Code Online (Sandbox Code Playgroud)

Oct*_*ean 324

好吧,只需执行错误消息告诉您的操作.

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

注意:

正如评论说,对于ActionBarSherlockAppCompat图书馆,有必要调用requestFeature()之前super.onCreate()

  • 该死的,这是一个优雅的答案. (60认同)
  • 对于ActionBarSherlock,还需要在`super.onCreate()`之前调用`requestFeature()`.参考:https://github.com/JakeWharton/ActionBarSherlock/issues/310#issuecomment-7350074 (60认同)
  • 与@Saran说的在AppCompat中的情况相同.你必须在`super.onCreate()`之前调用你的`requestFeature` (35认同)
  • 这个答案没有多大帮助......但我知道什么 (7认同)

Coo*_*ter 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() );
       // ...
   }
}
Run Code Online (Sandbox Code Playgroud)

*一些附加说明:

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

  • 感谢分享.我认为以下行`content = inflater.inflate(R.layout.custom_view,null);`应该是`content = li.inflate(R.layout.custom_view,null);`.所以,`inflater`必须被`li`取代. (2认同)

Ill*_*ent 14

我正在扩展DialogFragment,上面的答案没有用.我不得不使用getDialog()来实现删除标题:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

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

如果解决了您的问题,请点赞。