在添加内容之前必须调用 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
128412 次浏览

这个错误没有准确地告诉你出了什么问题吗? 你在调用 setContentView之后又调用了 requestWindowFeaturesetFeatureInt

顺便问一下,你为什么给 setContentView打了两次电话?

那么,就按照错误消息告诉您的去做。

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

注:

如注释中所说,对于 ActionBarSherlockAppCompat库,在 super.onCreate()之前调用 requestFeature()是必要的

我知道它已经有一年多的历史了,但是打电话给 requestFeature()从来没有解决过我的问题。事实上,我根本不叫它。

我想这是一个夸大视野的问题。尽管我一直在寻找合适的解决方案,但是直到我尝试了各种不同的视图放大方法之后,我才找到了。

警报对话框。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. 不要使用颜色属性或文本大小大量设置内容视图的样式。让对话框来处理这个问题,否则您可能会冒险在深蓝色对话框中放入黑色文本,因为供应商颠倒了颜色。

我正在扩展一个 对话片段和上述答案没有工作。我必须使用 getDialog ()来删除标题:

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

对于 SDK 23及以上版本,如果使用 AppCompatActivity 扩展活动,则会引发相同的 RuntimeException。如果您的活动直接来源于活动,则不会发生这种情况。

这是一个众所周知的问题在谷歌提到的 https://code.google.com/p/android/issues/detail?id=186440

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

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

如果在请求中遇到问题,将 编译 SDK 版本目标 SDK 版本改为 构建工具版本,在 建造,分级中改为 24.0.0

在我的案例中,我在 Activity中展示了 DialogFragment。在这个对话框片段中,我像在 删除黑色边框中一样写道:

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
}

要么删除 onCreate()中的 setStyle(STYLE_NO_FRAME, 0),要么更改/删除 onCreateDialog。因为对话框设置将在创建对话框后更改。

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

我在使用 AppCompatDialogFragment 时遇到了同样的问题,我的解决办法是:

override fun onAttachFragment(childFragment: Fragment) {
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE)
super.onAttachFragment(childFragment)
}