我正在尝试实现自定义标题栏:
这是我的助手课程:
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
答案 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() );
// ...
}
}
*一些附加说明:
答案 2 :(得分:11)
我正在扩展 DialogFragment ,上述答案无效。我不得不使用getDialog()来删除标题:
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
答案 3 :(得分:2)
错误是不是确切地告诉你什么是错的?在您致电requestWindowFeature
后,您正在呼叫setFeatureInt
和setContentView
。
顺便问一下,你为什么要两次打电话给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中创建对话框。