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

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

这是我的助手类:

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 

那么,只要做错误信息告诉你。

不要在requestFeature()之前调用setContentView() requestFeature()

注意:

正如在评论中所说的,对于ActionBarSherlockAppCompat库,都需要在super.onCreate()之前调用requestFeature() super.onCreate()

我知道它已经过了一年了,但是调用requestFeature()从来没有解决我的问题。 实际上,我根本不会这么称呼它。

这是一个夸大我认为的观点的问题。 尽pipe我所有的search,我都没有find一个合适的解决scheme,直到我玩弄不同的方法膨胀的观点。

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

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

我使用的最终解决scheme如下:

 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. 不要依赖隐藏标题。 尽pipe标题没有被设置,但是经常有空的空间。
  2. 不要尝试使用页眉页脚和中间视图构build自己的视图。 如上所述,标题可能不完全隐藏,尽pipe请求FEATURE_NO_TITLE。
  3. 不要过多地使用颜色属性或文本大小设置内容视图的样式。 让对话来处理这个问题,否则你可能会冒险把黑色文本放在深蓝色的对话框中,因为供应商会颠倒颜色。

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

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

错误是不是完全告诉你什么是错的? 在调用setContentView之后调用requestWindowFeaturesetFeatureInt

顺便说一句,你为什么要调用setContentView两次?

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

这是https://code.google.com/p/android/issues/detail?id=186440中提到的已知问题;

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

如果能解决您的问题,请注意。

如果在请求中遇到问题,请将build.gradle中的Compile SDK版本Target SDK版本更改为Build Tools版本24.0.0