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
Ответы
Ответ 1
Хорошо, просто сделайте то, что сообщает сообщение об ошибке.
Не вызывайте setContentView()
до requestFeature()
.
Примечание:
Как сказано в комментариях, для библиотеки ActionBarSherlock
и AppCompat
необходимо вызвать requestFeature()
до super.onCreate()
Ответ 2
Я знаю это в течение года, но вызов 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() );
// ...
}
}
* Некоторые дополнительные примечания:
- Не полагайтесь на скрытие заголовка. Часто бывает пустое пространство, несмотря на то, что заголовок не задан.
- Не пытайтесь создавать собственный вид с нижним колонтитулом и средним видом. Заголовок, как указано выше, может быть не полностью скрыт, несмотря на запрос FEATURE_NO_TITLE.
- Не используйте стиль содержимого с помощью атрибутов цвета или размера текста. Позвольте диалоговому дескриптору, что, кроме того, вы рискуете помещать черный текст в темно-синий диалог, потому что поставщик инвертировал цвета.
Ответ 3
Я расширял DialogFragment, и вышеупомянутый ответ didnot работы. Мне нужно было использовать getDialog(), чтобы удалить название:
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
Ответ 4
Разве ошибка точно не говорит вам, что случилось? Вы вызываете requestWindowFeature
и setFeatureInt
после того, как вы вызываете setContentView
.
Кстати, почему вы дважды вызываете setContentView
?
Ответ 5
Для SDK версии 23 и выше возникает одно и то же RuntimeException, если вы используете AppCompatActivity для расширения своей активности. Это не произойдет, если ваша деятельность происходит непосредственно из Activity.
Это известная проблема в google, как указано в https://code.google.com/p/android/issues/detail?id=186440
Работа, предусмотренная для этого, заключается в использовании метода supportRequestWindowFeature() вместо использования requestFeature().
Пожалуйста, поддержите, если он решает вашу проблему.
Ответ 6
Измените версию SDK версии, целевую версию SDK на версию Build Tools до 24.0.0 в build.gradle, если проблема с лицом в запросе Функция
Ответ 7
В моем случае я показал DialogFragment
в 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
}
Удалите setStyle(STYLE_NO_FRAME, 0)
в onCreate()
или chande/remove onCreateDialog
. Поскольку настройки диалога изменились после создания диалога.
Ответ 8
У меня была эта проблема с диалогами, основанными на расширенном DialogFragment, который отлично работал на устройствах с API 26, но не работал с API 23. Вышеуказанные стратегии не работали, но я решил проблему, удалив метод onCreateView (который был добавлен более недавний шаблон Android Studio) из DialogFragment и создания диалога в onCreateDialog.