在添加内容之前,必须调用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()
。
注意:
正如在评论中所说的,对于ActionBarSherlock
和AppCompat
库,都需要在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() ); // ... } }
*一些额外的说明:
- 不要依赖隐藏标题。 尽pipe标题没有被设置,但是经常有空的空间。
- 不要尝试使用页眉页脚和中间视图构build自己的视图。 如上所述,标题可能不完全隐藏,尽pipe请求FEATURE_NO_TITLE。
- 不要过多地使用颜色属性或文本大小设置内容视图的样式。 让对话来处理这个问题,否则你可能会冒险把黑色文本放在深蓝色的对话框中,因为供应商会颠倒颜色。
我正在扩展一个DialogFragment ,上面的答案没有工作。 我不得不使用getDialog()来实现删除标题:
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
错误是不是完全告诉你什么是错的? 在调用setContentView
之后调用requestWindowFeature
和setFeatureInt
。
顺便说一句,你为什么要调用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